我有一个客户端接口,用于发送以base64编码的二进制数据。数据是一个29字节自定义格式的字节有效负载,用于描述事件。 29个字节由许多字段组成;每个都有独特的长度。
我需要服务器解码,以便我可以提取字段。我尝试使用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()调用中所需字节的String?
我不会在服务器上编写二进制数据,就像通常使用base64编码一样。那么我应该从base64转到其他一些编码来访问各个字节吗?
我在用base64编码的已知文本字符串上使用相同的代码来验证基本逻辑。但是当源数据在编码之前是二进制数据时,控制台语句不会打印任何内容。我可以从二进制到base64到字符串吗?
答案 0 :(得分:0)
数据似乎没有有效的ASCII或UTF-8字符串,event_type和addr是一些二进制数据。使用十六进制表示并打印出来。
var event_type = buff.slice(3,6).toString('hex'); => '00010a'
答案 1 :(得分: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个字节长度),则必须遍历数组索引。