Javascript Node.js使用缓冲区解析原始字节

Javascript Node.js使用缓冲区解析原始字节,javascript,parsing,node.js,Javascript,Parsing,Node.js,我尝试使用缓冲区解析以奇数方式格式化的29字节数据。我一直在使用slice()方法分割这些奇怪边界上的数据。样本流以十六进制显示如下(为清晰起见添加了空格) 01 1d 00 01 0a 0a 0b 0b 0c 0c 00 04 d2 00 00 0e c8 00 00 cc c4 var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4'; buff = new Buffer(raw, 'utf8'); var

我尝试使用缓冲区解析以奇数方式格式化的29字节数据。我一直在使用slice()方法分割这些奇怪边界上的数据。样本流以十六进制显示如下(为清晰起见添加了空格)

01 1d 00 01 0a 0a 0b 0b 0c 0c 00 04 d2 00 00 0e c8 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...
这将生成消息类型=1和事件类型=0。它应该分别为0和1。接下来的所有片段都是错误的

我显然误解了这里的编码。在缓冲区实例化过程中或在toString()提取过程中

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


谢谢

我认为答案是你的
缓冲区不代表你认为它代表的对象:

> 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
var raw='01 02 03' >buff=新缓冲区(原始“utf8”) >buff.切片(0,0) >浅黄色切片(0,1) >浅黄色切片(0,2) >浅黄色切片(0,3) >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' >浅黄色长度 8.
它不是表示3字节长的缓冲区,而是表示8字节长的缓冲区。当您将其切片时,您将获得字符的单个十六进制值。(注意空格是
20
——就像
%20
在URL中无处不在。)

但我感觉你的
var='01 1d 00…“
只是试图用一些二进制数据填充缓冲区,而不是程序中实际发生的事情——使用实际填充缓冲区的简化版本可能更容易。可能从文件中读取它?

节点直接使用
hex
编码支持这一点:

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

buff.slice(位置,位置+1)
返回一个字符还是两个字符?该缓冲区上的toString()结果是一个字符长。但是-buff.slice(位置,位置+6)上的toString()结果;是12个字符长。你是对的,我的例子并不完全准确。原始数据中没有空格。我将对问题进行编辑以反映这一点。但您是否收到了一个包含二进制数据的ascii编码十六进制值的字符串?或者你正在被交给实际的二进制数据?我现在处理的例子是一个ascii编码的十六进制值字符串。我最初的解决方案是有效的——我只是错误地增加了位置变量。但是我很好奇,如果数据是通过web服务接口传递的,那么二进制数据是一个选项吗?如果您使用的是流,那么--我只是不知道如何将二进制数据的ASCII值十六进制表示转换为
缓冲区
对象。