-1

私は、cプログラムを使って記録されたデータを含むバイナリファイルを持っています。 ファイルに格納されたデータは浮動小数値です。 これで、After Effectsスクリプトのバイナリファイルから浮動小数点数を取得する必要があります。 これは私のコードです:バイナリファイルからfloat値を読み込む(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

whitout任意の分離文字(、)

各浮動小数点数は4バイトを使用します。

+0

私はこれがextendscriptだと思いますか? myFile.read(4)がバッファに設定する内容を簡単に説明できますか?それは0と1の文字列か、それとも実際の2進数ですか? – Shilly

+0

[この投稿](https://forums.adobe.com/message/101026#101026)が役立つかもしれませんが、今すぐ公式のAPIドキュメントを見つけることができません... –

+0

はい、それはextendscriptです。 –

答えて

0

これを試してください。それは入力がIEEE 754 floating-point standardによって書かれたと仮定します。私はthis answerからの解析機能を使用しました。サンプル入力ファイルはhereです。セパレータなしの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; 
} 
+0

多くの感謝Sangbokリー! サンプルファイルがなくなり、テストできません。しかし、できるだけ早く新しいサンプルファイルを作成してテストします。 –

+0

+サンプルファイルを再アップロードできますか? –

+0

[こちら](https://www.dropbox.com/s/bst2ssnzk804uga/input.dat?dl=0)です。 –

関連する問題