Node.js数据用Bufferparsing原始字节

我试图使用缓冲区parsing29个字节的数据格式以奇怪的方式。 我一直在使用slice()方法来分割这些奇怪边界上的数据。 示例stream在hex中看起来像以下内容(为了清晰起见,添加了空格)…

01 1d 00 00 01 0a 0a 0b 0b 0c 0c 00 00 04 d2 00 00 00 0e c8 00 00 00 00 00 00 00 cc c4

var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4'; buff = new Buffer(raw, 'utf8'); var position = 2; // message type var msg_type = buff.slice(position,(position+1)).toString(); position += 1; console.log('... message type is ' + msg_type); // event type var event_type = buff.slice(position,(position+1)).toString(); position += 1; console.log('... event type is ' + event_type); // grab more data... 

这产生一个msg_type = 1和event_type = 0。 它应该分别是0和1。 所有跟随的切片是错误的。

我很明显误解了这里的编码。 在Buffer实例化过程中或在toString()提取过程中。

我怎样才能把这个inputstream当作一系列的hexstring,并将它们转换成我可以操作的二进制数据?

谢谢!

我认为答案是你的Buffer不代表你认为它的对象:

 > var raw = '01 02 03' > buff = new Buffer(raw, 'utf8') <Buffer 30 31 20 30 32 20 30 33> > buff.slice(0,0) <Buffer > > buff.slice(0,1) <Buffer 30> > buff.slice(0,2) <Buffer 30 31> > buff.slice(0,3) <Buffer 30 31 20> > buff.slice(0,0).toString() '' > buff.slice(0,1).toString() '0' > buff.slice(0,2).toString() '01' > buff.slice(0,3).toString() '01 ' > buff.slice(0,4).toString() '01 0' > buff.slice(0,5).toString() '01 02' > buff.slice(0,6).toString() '01 02 ' > buff.slice(0,7).toString() '01 02 0' > buff.slice(0,8).toString() '01 02 03' > buff.length 8 

代表一个三字节长的缓冲区,代表一个8字节长的缓冲区。 当你切入它,你得到的字符个别hex值。 (请注意,空格是20 ,就像在URL中无处不在的%20一样)。

但是我有一种感觉,你的var = '01 1d 00...'只是试图用一些二进制数据来填充缓冲区,而不是实际上在你的程序中发生的事情 – 使用一个简化的版本可能会更容易你实际上正在填充缓冲区。 也许读出来的文件?

节点的缓冲区直接用hex编码来支持:

 var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4'; var buff = new Buffer(raw, 'hex');