Node.js数据使用Buffer解析原始字节

Gre*_*reg 5 javascript parsing node.js

我正在尝试使用Buffer来解析以奇数方式格式化的29个字节的数据.我一直在使用slice()方法来分割这些奇数边界上的数据.示例流在十六进制中看起来如下所示(为清晰起见添加了空格)...

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...
Run Code Online (Sandbox Code Playgroud)

这会产生msg_type = 1和event_type = 0.它应分别为0和1.随后的所有切片都是错误的.

我显然在这里误解了编码.在Buffer实例化期间或在toString()提取期间.

如何将此输入流视为一系列十六进制字符串并将其转换为可以操作的二进制数据?

谢谢!

Gra*_*meF 14

Node的Buffer直接支持hex编码:

var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4';
var buff = new Buffer(raw, 'hex');
Run Code Online (Sandbox Code Playgroud)


sar*_*old 5

我认为答案是你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
Run Code Online (Sandbox Code Playgroud)

这表示一个长度为8个字节的缓冲区,而不是表示三个字节长的缓冲区.当您切入它时,您将获得字符的各个十六进制值.(注意空间是20- 就像%20URL中普遍存在的那样.)

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