我正在尝试使用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...
这会产生msg_type = 1和event_type = 0。它应分别为0和1。接下来的所有切片都是错误的。
我显然在这里误解了编码。在Buffer实例化期间或在toString()提取期间。
如何将此输入流视为一系列十六进制字符串并将其转换为可以操作的二进制数据?
谢谢!
答案 0 :(得分:14)
节点Buffer直接使用hex
编码支持此功能:
var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4';
var buff = new Buffer(raw, 'hex');
答案 1 :(得分: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
而不是表示三个字节长的缓冲区,而是表示一个8字节长的缓冲区。当您切入它时,您将获得字符的各个十六进制值。 (请注意,空格为20
- 就像%20
在URL中无处不在。)
但我感觉你的var = '01 1d 00...'
只是试图用一些二进制数据来填充缓冲区而不是你的程序中实际发生的事情 - 你可能更容易使用你的简化版本实际上填充缓冲区。也许从文件中读出来?