Protocol Buffers byte []数组到节点Javascript缓冲区

时间:2015-03-12 08:51:15

标签: javascript node.js serialization protocol-buffers decode

我有一个由java使用Google的Protocol Buffers toByteArray()方法(docs)生成的ByteStrings列表,如下所示:

  ...
  [B@e3bbd6a
  [B@5f9c39ba
  [B@11838ae3
  [B@57dc7b85
  [B@61870e86
  [B@2592cb49
  ...

我假设它们是UTF-8字节字符串(但我不确定),但我如何将它们转换为JavaScript缓冲区?我使用节点的protocol-buffers软件包进行解码,但它们可以解码的格式如下所示:

<Buffer 00 c0 a9 07 12 08 43 61 64 69 6c 6c 61 63>

我尝试过使用node的Buffer api,但还没有取得多大成功。

有关从哪里开始的任何提示?我之前被问过this question,这是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

我认为您将字节数组与其调试字符串表示混淆。字节数组(或缓冲区)必须包含UTF-8文本,并且无法以文本形式打印,因此当您尝试以各种语言打印它们时,运行时将尝试创建作为方便,值的人类可读文本表示。 Java和Node以完全不同的方式为相同的底层值执行此操作。

Java:字符串[B@e3bbd6a不是字节数组的内容。当您在Java toString()上调用byte[]时,会得到一些这样的文本,但它告诉您的是该对象是位于地址e3bbd6a的字节数组。这不是数组的内容,只是内存地址。 (这里的想法是,如果您打印两个不同的byte[]值,您将能够根据匹配的地址判断它们是否是同一个对象,否则文本完全没有意义。)

节点:字符串<Buffer 00 c0 a9 ...>再次只是一个友好的人类可读字符串,用于调试目的。这不是实际的低级表示 - 低级表示是原始字节,即数值00c0a9等。

没有必要在两者之间“转换”。如果您在Java中有byte[]并将其写入套接字或文件,然后将Node中的该套接字或文件读入Buffer对象,则Buffer实际上将包含相同的数据。