【问题标题】:Protocol Buffers byte[] array to node Javascript bufferProtocol Buffers byte[] 数组到节点 Javascript 缓冲区
【发布时间】:2015-03-12 08:51:14
【问题描述】:

我有一个由 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,这是最好的方法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 因此,如果我将[B@e3bbd6a 之类的字符串列表写入套接字,并使用节点从该套接字读取,我如何获取数据以便对其进行解码?我是否理解我只是将字节数组的地址写入套接字而不是实际数据?
    • 不要将字符串写入套接字,写入实际的字节数组。例如。 OutputStream#write()byte[] 作为参数,而不是 String。如果你使用它,你写的是实际的字节,而不是指针。在 Node 端,从套接字读取通常会产生一个 Buffer。
    • 非常感谢!你的建议正是我需要的正确推动力。现在我让它工作了,双方都在愉快地编码、流式传输和解码。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多