2015-06-18 15 views
7

Angenommen, ich habe einen Hex-Datenstrom, den ich in 3-Byte-Blöcke teilen möchte, die ich als eine ganze Zahl lesen muss.JavaScript: lesen 3 Bytes Puffer als eine ganze Zahl

Zum Beispiel: Bei einer Hex-Zeichenfolge 01be638119704d4b9a muss ich die ersten drei Bytes 01be63 lesen und es als Integer 114275 lesen. Das ist, was ich habe:

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

Die readUInt32BE funktioniert perfekt für 4-Byte-Daten, aber hier bekomme ich offensichtlich:

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

Wie ich richtig 3-Bytes als ganze Zahl liest?

Antwort

16

Wenn Sie node.js v0.12 + oder io.js verwenden, ist es buffer.readUIntBE(), die eine variable Anzahl von Bytes erlaubt:

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

(Beachten Sie, dass es readUIntBE für Big Endian und readUIntLE für Little Endian).

Andernfalls, wenn Sie auf einer älteren Version des Knotens sind, werden Sie es manuell zu tun haben (Grenzen zuerst natürlich überprüfen):

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

Danke! Ich muss die 'readUIntBE'-Funktion vermisst haben. Es funktioniert perfekt. – kmachnicki

+0

Um ein paar Mikrosekunden zu sparen: var Dezimal = (((Puffer [0] << 8) + (Puffer [1]) << 8) + Puffer [2]; –

-3

Sie drei Byte auf vier Byte umwandeln sollte.

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(); 
} 

Sie können diese Funktion ausprobieren.

Verwandte Themen