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



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

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

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

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

我尝试使用node的缓冲区api,但没有取得多大成功。

关于从哪里开始的任何提示? 我发现之前问过这个问题,这是最好的方法吗?

我认为

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

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

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

没有必要

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

最新更新