JavaScript: lire 8 octets en 64 bits entiers

J'ai un objet tampon qui contient huit octets. Ces huit octets devraient maintenant être interprétés comme un nombre entier de 64 bits.

Actuellement, j'utilise l'algorithme suivant:

var int = buff[0]; for (var i = 1; i < buff.length; i++) { int += (buff[i] * Math.pow(2, 8 * i)); } console.log(int); 

Cela fonctionne mais je crois qu'il y a de meilleures façons (peut-être en utilisant Uint64Array).

Malheureusement, je ne peux pas trouver comment un Uint16Array pourrait m'aider ici.

Cordialement

Mettre à jour:

 // puts two 32bit integers to one 64bit integer var bufInt = (buf.readUInt32BE(0) << 8) + buf.readUInt32BE(4); 

Javascript ne prend pas en charge des nombres entiers de 64 bits, car le type de nombre natif est un double de 64 bits, ne donnant que 53 bits de gamme entière.

Vous pouvez créer des tableaux de 32 bits (c'est-à-dire Uint32Array ), mais s'il y avait une version 64 bits de ceux-là, il n'y aurait aucun moyen de copier des valeurs en variables autonomes.

Vous pouvez utiliser node-int64 pour la prise en charge entière de 64 bits:

 var Int64 = require('node-int64'); var int64 = new Int64(buff); 

Il existe quelques modules pour fournir un support de 64 bits entier.

  • Node-bigint
  • Bignum (basé sur OpenSSL)

Peut-être que votre problème peut être résolu en utilisant l'une de ces bibliothèques.

Pour une pitié, la réponse correcte est que Javascript ne supporte pas les nombres entiers de 64 bits (jusqu'à maintenant).

Donc, en essayant d'obtenir l'entier exact de 64 bits stocké dans vos 8 octets en une seule variable de type JS, échouera. En tous cas.

Quelques décisions:

  1. Des bits exacts de 0 à 52:

Si vous n'avez pas besoin de 11 bits supérieurs de 64 bits et que vous pouvez traiter avec des nombres entiers exacts de 53 bits, vous pouvez utiliser de cette façon:

 // puts up to 53 bits by 32bit integers to one "64bit" integer var bufInt = (buf.readUInt32BE(0) & 0x001FFFFF) * 4294967296 + buf.readUInt32BE(4); 

(Question éditée)

  1. Intérêt "64 bits" avec des états corrects de 11 bits faibles:

Sinon, si vous avez besoin de "grande valeur commune" de 64 bits et que vous ne vous intéressiez pas aux valeurs exactes de jusqu'à 11 bits bas (à droite de 2-3 chiffres d'une grande valeur de 64 bits), vous pouvez utiliser de cette façon:

 // puts 64 bit value by 32bit integers to one "64bit" integer // with possible loose of lower 11 bits correctness var bufInt = buf.readUInt32BE(0) * 4294967296 + buf.readUInt32BE(4); 

Pour ceux qui s'intéressent à int64 (64 bits entiers support) en Javascript, prenez garde!

Regardez:

 var x1 = 1 << 30; var x2 = 1 << 31; var x3 = 1 << 32; var x4 = 1 << 33; var a = 1240611072103715194; var b = 1240611072103715193; var c = 1240611072103700000; alert('' + 'x1=' + x1 + ' (should =1073741824)\n' + 'x2=' + x2 + ' (should =2147483648)\n' + 'x3=' + x3 + ' (should =4294967296)\n' + 'x4=' + x4 + ' (should =8589934592)\n' + 'a=' + a + ' (should =1240611072103715194)\n' + 'ab=' + (ab) + ' (should =1)\n' + 'ac=' + (ac) + ' (should =15194)\n' ); RESULT: x1=1073741824 (should =1073741824) x2=-2147483648 (should =2147483648) x3=1 (should =4294967296) x4=2 (should =8589934592) a=1240611072103715000 (should =1240611072103715194) ab=0 (should =1) ac=15104 (should =15194)