-1

J'ai un fichier binaire contenant des données enregistrées à l'aide d'un programme c. les données stockées dans les fichiers sont des valeurs flottantes. Maintenant, j'ai besoin de récupérer les nombres flottants du fichier binaire dans le script After Effects. Voici mon code:lecture de valeurs flottantes à partir d'un fichier binaire (dans le script 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); 
    ??? 
} 

la question est de savoir comment convertir le tampon à un nombre flottant. Merci beaucoup d'avance.

le fichier d'entrée est somthing comme ceci:

7,26, -3,32, -5,18 7.66,3.65, -5,37 8,11, -4.17,5.11 8,40, -5.17,4.80

tout whitout caractère de séparation (,)

Chaque nombre à virgule flottante utilise 4 octets.

+0

Je suppose que c'est extendScript? Pouvez-vous expliquer brièvement à quoi myFile.read (4) mettra le tampon à? Est-ce une chaîne de 0 et de 1, ou est-ce un nombre binaire réel? – Shilly

+0

Peut-être [cet article] (https://forums.adobe.com/message/101026#101026) vous aidera, mais je ne trouve pas la documentation officielle de l'API en ce moment ... –

+0

oui, c'est extendcript. –

Répondre

0

Essayez ceci. Il suppose que l'entrée a été écrite par IEEE 754 floating-point standard. J'ai utilisé la fonction d'analyse syntaxique de this answer. Exemple de fichier d'entrée est here. Il se compose de 4 valeurs (7.26, -3.32, -5.18, 7.66) sans seperator, sa taille est donc 4 * 4 = 16 octets.

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

beaucoup de mercis beaucoup Sangbok Lee! votre fichier d'exemple est parti, et je ne peux pas le tester. Mais dès que possible, j'écris un nouveau fichier d'échantillon et je vais tester. –

+0

+ pouvez-vous reeupload votre fichier d'échantillon? –

+0

[ici] (https://www.dropbox.com/s/bst2ssnzk804uga/input.dat?dl=0) c'est. –