web-dev-qa-db-fra.com

JavaScript: lecture du tampon de 3 octets sous forme d'entier

Disons que j'ai un flux de données hexadécimal, que je veux diviser en blocs de 3 octets que je dois lire comme un entier.

Par exemple: étant donné une chaîne hexadécimale 01be638119704d4b9a J'ai besoin de lire les trois premiers octets 01be63 et le lire comme un entier 114275. Voici ce que j'ai obtenu:

var sample = '01be638119704d4b9a';
var buffer = new Buffer(sample, 'hex');
var bufferChunk = buffer.slice(0, 3);
var decimal = bufferChunk.readUInt32BE(0);

Le readUInt32BE fonctionne parfaitement pour les données de 4 octets, mais ici j'obtiens évidemment:

RangeError: index out of range
  at checkOffset (buffer.js:494:11)
  at Buffer.readUInt32BE (buffer.js:568:5)

Comment lire correctement les 3 octets en entier?

16
kmachnicki

Si vous utilisez node.js v0.12 + ou io.js, il y a buffer.readUIntBE() qui autorise un nombre variable d'octets:

var decimal = buffer.readUIntBE(0, 3);

(Notez que c'est readUIntBE pour Big Endian et readUIntLE pour Little Endian).

Sinon, si vous utilisez une ancienne version de node, vous devrez le faire manuellement (vérifiez d'abord les limites bien sûr):

var decimal = (buffer[0] << 16) + (buffer[1] << 8) + buffer[2];
32
mscdex

J'utilise ceci, si quelqu'un sait que quelque chose ne va pas, veuillez le conseiller;

const integer = parseInt(buffer.toString("hex"), 16)
1
Ernest Okot