2011-11-23 66 views
1

我有一个客户端接口,用于发送以base64编码的二进制数据。数据是描述事件的29字节自定义格式的字节有效负载。 29个字节由多个字段组成;每个都有独特的长度。使用缓冲区对象解码base64输入

我需要服务器来解码,所以我可以提取字段。我尝试过使用Buffer对象,因为我在另一个使用案例中使用了data was passed in hex format,但没有成功。

buff = new Buffer('AR0AAAEKCgsLDAwAAATSAAAADsgAAAAAAAAAzMQ=', 'base64'); 

// track the current position 
// ... get out to the data portion of the message 
var position = 3; 

// event type 
var event_type = buff.slice(position,(position+3)).toString('utf8'); 
position += 3; 
console.log('... event type: ' + event_type + ' /'); 

// address 
var addr = buff.slice(position,(position+3)).toString('utf8'); 
position += 3; 
console.log('... addr: ' + addr + ' /'); 

.toString('utf8')可能是根本原因。我怎样才能得到一个表示这些slice()调用中所需字节的字符串?

我不是在服务器上描述二进制数据,正如通常用base64编码所做的那样。那么我应该从base64到其他编码来访问单个字节吗?

我已经使用base64编码的已知文本字符串上的相同代码来验证基本逻辑。但是,当源数据在编码之前是二进制的时,控制台语句不会打印任何内容。我可以从二进制到base64到字符串?

+0

什么不行?另外,这些字段中的数据是否真的是utf8? – thejh

+0

这些控制台语句中没有打印任何内容...我只是更新了问题,以反映我已使用base64编码的已知文本字符串验证了代码路径。 – Greg

+0

它打印'...事件类型:/'还是什么都不? – thejh

回答

0

该实现的问题是使用slice()来剖析字节流。 slice()的参数是索引 - 不是字节偏移量。这似乎是一个相当大的缺陷。我不确定为什么有人会在与缓冲区交互时做到这一点。

无论如何,解决方案是作为一个数组访问buff。

// event type 
var event_type = buff[position].toString('utf8'); 
position += 1; 
console.log('... event type: ' + event_type + ' /'); 

// address 
var addr = buff[position].toString('utf8'); 
position += 1; 
console.log('... addr: ' + addr + ' /'); 

如果要连接多个字节(原始示例具有3个字节长度),则必须遍历数组索引。

0

数据似乎没有有效的ASCII或UTF-8字符串,event_type和addr是一些二进制数据。使用十六进制演示文稿并打印。

var event_type = buff.slice(3,6).toString('hex'); => '00010a'