【问题标题】:Decoding base64 input with a Buffer object使用 Buffer 对象解码 base64 输入
【发布时间】:2012-01-05 00:21:39
【问题描述】:

我有一个客户端接口,可以发送以 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() 调用中获得表示所需字节的字符串?

我不会像通常使用 base64 编码那样在服务器上存储二进制数据。那么我应该从 base64 转换为其他编码来访问各个字节吗?

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

【问题讨论】:

  • 什么不起作用?另外,字段中的数据真的是utf8吗?
  • 这些控制台语句中没有打印任何内容...我刚刚更新了问题以反映我已经使用用 base64 编码的已知文本字符串验证了代码路径的事实。
  • 打印... event type: / 还是什么都不打印?
  • 对我有用(虽然你的数据中有奇怪的字节,它只是空格和一个字节)
  • 我在此过程中发现的一件事是 slice() 中使用的参数是索引 - 而不是字节偏移量。所以我目前的方法根本行不通。我需要学习如何将 base64 数据转换为字节流或十六进制值数组,然后将它们分解为数据中的各个字节。

标签: javascript node.js base64 decoding


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2012-12-25
      • 1970-01-01
      • 2015-07-14
      • 2022-11-11
      • 2013-09-14
      • 1970-01-01
      相关资源
      最近更新 更多