2015-06-18 16 views
7

Załóżmy, że mam strumień danych heksadecymalnych, który chcę podzielić na bloki 3-bajtowe, które muszę odczytać jako liczbę całkowitą.JavaScript: odczyt 3 bajtów Bufor jako liczba całkowita

Na przykład: dany łańcuch szesnastkowy 01be638119704d4b9a Muszę przeczytać pierwsze trzy bajty 01be63 i odczytać je jako liczbę całkowitą 114275. To jest to, co mam:

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

W readUInt32BE działa doskonale na danych 4 bajty, ale tu oczywiście dostać:

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

Jak czytać 3 bajtów As Integer prawidłowo?

Odpowiedz

16

Jeśli używasz node.js v0.12 + lub io.js istnieje buffer.readUIntBE() który pozwala na zmienną liczbę bajtów:

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

(Należy pamiętać, że jest to readUIntBE dla big endian i readUIntLE dla najmniejszych Endian).

W przeciwnym razie, jeśli masz starszą wersję węzła, będziesz musiał zrobić to ręcznie (sprawdź najpierw granic oczywiście):

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

Dzięki! Musiałeś przeoczyć tę funkcję 'readUIntBE'. Działa idealnie. – kmachnicki

+0

Aby zapisać kilka mikrosekund: var decimal = (((buffer [0] << 8) + (buffer [1]) << 8) + buffer [2]; –

-3

należy przekonwertować bajt trzy do czterech bajtów.

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

Możesz wypróbować tę funkcję.

Powiązane problemy