我有一个由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,这是最好的方法吗?
答案 0 :(得分:1)
我认为您将字节数组与其调试字符串表示混淆。字节数组(或缓冲区)不必须包含UTF-8文本,并且无法以文本形式打印,因此当您尝试以各种语言打印它们时,运行时将尝试创建作为方便,值的人类可读文本表示。 Java和Node以完全不同的方式为相同的底层值执行此操作。
Java:字符串[B@e3bbd6a
不是字节数组的内容。当您在Java toString()
上调用byte[]
时,会得到一些这样的文本,但它告诉您的是该对象是位于地址e3bbd6a
的字节数组。这不是数组的内容,只是内存地址。 (这里的想法是,如果您打印两个不同的byte[]
值,您将能够根据匹配的地址判断它们是否是同一个对象,否则文本完全没有意义。)
节点:字符串<Buffer 00 c0 a9 ...>
再次只是一个友好的人类可读字符串,用于调试目的。这不是实际的低级表示 - 低级表示是原始字节,即数值00
,c0
,a9
等。
没有必要在两者之间“转换”。如果您在Java中有byte[]
并将其写入套接字或文件,然后将Node中的该套接字或文件读入Buffer对象,则Buffer实际上将包含相同的数据。