2015-06-18 8 views
7

Diciamo che ho un flusso di dati esadecimale, che voglio dividere in blocchi di 3 byte che ho bisogno di leggere come numero intero.JavaScript: lettura di 3 byte Buffer come intero

Ad esempio: data una stringa esadecimale 01be638119704d4b9a Ho bisogno di leggere i primi tre byte 01be63 e leggerlo come numero intero 114275. Questo è quello che ho ottenuto:

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

I readUInt32BE funziona perfettamente per i dati di 4 byte, ma qui ovviamente ottenere:

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

Come faccio a leggere 3-byte come numero intero in modo corretto?

risposta

16

Se si utilizza node.js v0.12 + o io.js, c'è buffer.readUIntBE() che consente a un numero variabile di byte:

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

(Si noti che è readUIntBE per Big Endian e Little readUIntLE Endian).

In caso contrario, se siete su una versione precedente di nodo, si dovrà farlo manualmente (controllare prima limiti ovviamente):

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

Grazie! Deve essersi persa la funzione 'readUIntBE'. Funziona perfettamente. – kmachnicki

+0

Per salvare alcuni microsecondi: var decimal = (((buffer [0] << 8) + (buffer [1]) << 8) + buffer [2]; –

-3

si dovrebbe convertire i tre byte a quattro byte.

function three(var sample){ 
    var buffer = new Buffer(sample, 'hex'); 

    var buf = new Buffer(1); 
    buf[0] = 0x0; 

    return Buffer.concat([buf, buffer.slice(0, 3)]).readUInt32BE(); 
} 

È possibile provare questa funzione.

Problemi correlati