Node.js数据使用Buffer解析原始字节 [英] Node.js data parsing raw bytes with Buffer

查看:256
本文介绍了Node.js数据使用Buffer解析原始字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to use Buffer to parse 29 bytes of data that is formatted in odd ways. I've been using the slice() method to carve up the data on these odd boundaries. A sample stream looks like the following in hex (spaces added for clarity)...

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

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。接下来的所有切片都是错误的。

This produces an msg_type=1 and event_type=0. It should be 0 and 1, respectively. All of the slices that follow are wrong.

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

I'm clearly misunderstanding something with the encoding here. Either during Buffer instantiation or in the toString() extraction.

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

How can I treat this input stream as a series of hex strings and convert them into binary data that I can operate on?

谢谢!

推荐答案

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

I think the answer is that your Buffer doesn't represent the object you think it does:

> 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中无处不在。)

Instead of representing a buffer that is three bytes long, this represents a buffer that is 8 bytes long. As you slice into it, you're getting the individual hexadecimal values of the characters. (Note the space is 20 -- just like the %20 so ubiquitous in URLs.)

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

But I have a feeling your var = '01 1d 00...' is just an attempt to populate the buffer with some binary data rather than what's actually happening in your program -- it might be easier to work with a simplified version of how you're actually filling the buffer. Maybe read it out of a file?

这篇关于Node.js数据使用Buffer解析原始字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆