чтение значений с плавающей запятой из двоичного файла (в сценарии после эффектов)

У меня есть двоичный файл, содержащий данные, записанные с помощью программы C. данные, хранящиеся в файлах, являются значениями с плавающей запятой. Теперь мне нужно получить числа с плавающей запятой из двоичного файла в сценарии After Effects. Это мой код:

var myFile = File.openDialog('select file');
myFile.open("r");
myFile.encoding = "binary";
for(x=0;x<myFile.length;x += 4){
     myFile.seek(x,0);
     buffer = myFile.read(4);
     ???
}

вопрос в том, как преобразовать буфер в число с плавающей запятой. Спасибо заранее.

входной файл выглядит примерно так:

7.26,-3.32,-5.18 7.66,3.65,-5.37 8.11,-4.17,5.11 8.40,-5.17,4.80

без символа разделения (,)

Каждое число с плавающей запятой занимает 4 байта.


person Saeed Shahriyari    schedule 10.02.2017    source источник
comment
Полагаю, это расширенный скрипт? Не могли бы вы вкратце объяснить, что myFile.read (4) устанавливает значение буфера? Это строка из нулей и единиц или это фактическое двоичное число?   -  person Shilly    schedule 10.02.2017
comment
Возможно, вам поможет этот пост, но я не могу найти официальную документацию по API правильно Теперь...   -  person Sangbok Lee    schedule 10.02.2017
comment
да, это расширенный скрипт.   -  person Saeed Shahriyari    schedule 10.02.2017
comment
И если вы опубликуете входной файл и напишете какой-нибудь желаемый пример вывода, вы получите дополнительную помощь.   -  person Sangbok Lee    schedule 10.02.2017
comment
Большое спасибо Сангбок, я добавляю некоторые детали в первый пост   -  person Saeed Shahriyari    schedule 10.02.2017


Ответы (1)


Попробуй это. Предполагается, что ввод был написан стандартом с плавающей запятой IEEE 754. Я использовал функцию синтаксического анализа из этого ответа. Образец входного файла находится здесь. Он состоит из 4 значений (7,26, -3,32, -5,18, 7,66) без разделителя, поэтому его размер составляет 4 * 4 = 16 байт.

var myFile = File.openDialog('select file');
myFile.open("r");
myFile.encoding = "binary";

var buffers = [];
for(var x=0; x<myFile.length; x += 4) {
    myFile.seek(x, 0);
    var buffer = "0x";
    for(var y=0; y<4; y++) {
        var hex = myFile.readch().charCodeAt(0).toString(16);
        if(hex.length === 1) {
            hex = "0" + hex;
        }
        buffer += hex;
    }
    buffers.push(parseFloat2(buffer));

}
alert(buffers);


function parseFloat2(str) {
    // from https://stackoverflow.com/a/14090278/6153990
    var float2 = 0;
    var sign, order, mantiss, exp, int2 = 0, multi = 1;
    if (/^0x/.exec(str)) {
        int2 = parseInt(str,16);
    } else {
        for (var i = str.length -1; i >=0; i -= 1) {
            if (str.charCodeAt(i)>255) {
                alert('Wrong string parametr'); 
                return false;
            }
            int2 += str.charCodeAt(i) * multi;
            multi *= 256;
        }
    }
    sign = (int2>>>31)?-1:1;
    exp = (int2 >>> 23 & 0xff) - 127;
    mantiss = ((int2 & 0x7fffff) + 0x800000).toString(2);
    for (i=0; i<mantiss.length; i+=1){
        float2 += parseInt(mantiss[i])? Math.pow(2,exp):0;
        exp--;
    }
    return float2*sign;
}
person Sangbok Lee    schedule 11.02.2017
comment
большое спасибо Сангбок Ли! ваш образец файла исчез, и я не могу его проверить. Но как можно скорее напишу новый образец файла и протестирую. - person Saeed Shahriyari; 03.10.2017
comment
+ можете ли вы повторно загрузить образец файла? - person Saeed Shahriyari; 03.10.2017
comment
здесь. - person Sangbok Lee; 13.10.2017