用Buffer对象解码base64输入

Decoding base64 input with a Buffer object

本文关键字:base64 输入 解码 对象 Buffer      更新时间:2023-09-26

我有一个发送base64编码二进制数据的客户端接口。数据是一个29字节的自定义格式化的字节有效负载,用于描述事件。这29个字节由许多字段组成;每个都有唯一的长度。

我需要服务器解码,以便我可以提取字段。我尝试过使用Buffer对象,因为我用另一个用例来传递十六进制格式的数据,没有成功。

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再到字符串吗?

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

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

这个实现的问题是使用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个字节长度),您必须遍历数组索引。