我有一个由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 ...>
再次只是一个友好的人类可读字符串,用于调试目的。这不是实际的低级表示 - 低级表示是原始字节,即数值00
、c0
、a9
等。
在两者之间"转换"。如果您在 Java 中有一个byte[]
并将其写入套接字或文件,然后将 Node 中的套接字或文件读取到 Buffer 对象中,则缓冲区实际上将包含相同的数据。