2015-06-18 21 views
7

Diyelim ki bir tamsayı olarak okumam gereken 3 baytlık bloklara bölmek istediğim bir hex veri akışı var.JavaScript: 3 bayt okuma Tamsayı olarak arabellek

Örneğin: onaltılık bir dize 01be638119704d4b9a verilen ilk üç bayt 01be63 okumanız ve 114275 tamsayı olarak okudum. Bu bende ne olduğunu:

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

readUInt32BE eserler mükemmel 4-byte veri için, ama burada açıkçası olsun: Ben doğru tamsayı olarak 3-byte okumak nasıl

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

?

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

(o Little için büyük Endian için readUIntBE ve readUIntLE olduğunu Not:

cevap

16

Eğer node.js v0.12 + veya io.js kullanıyorsanız, bayt değişken sayıda sağlar buffer.readUIntBE() var endian). Eğer düğümün eski bir sürümünü kullanıyor iseniz

Aksi takdirde, (ilk ders sınırlarını kontrol edin) elle yapmak zorunda kalacaktır: Eğer dört bayt için üç bayt dönüştürmek gerekir

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

Teşekkürler! Bu readUIntBE işlevini kaçırmış olmalı. Mükemmel çalışıyor. – kmachnicki

+0

Birkaç mikrosaniyeyi kaydetmek için: ondalık = (((tampon [0] << 8) + (tampon [1]) << 8) + buffer [2]; –

-3

.

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

Bu işlevi deneyebilirsiniz.

İlgili konular