将 Java 字节数组转换为 Node.js 中的缓冲区

Converting Java byte array to Buffer in Node.js

在 Android 应用程序中,我有一个包含以下格式数据的字节数组:

在另一个 Node.js 服务器中,相同的数据存储在一个缓冲区中,如下所示:

我正在寻找一种将两种数据转换为相同格式的方法,以便我可以比较两者并检查它们是否相等。解决这个问题的最佳方法是什么?

[B@cbf1911 不是一种格式。这是在没有自定义 toString 实现的 java 对象上调用 .toString() 方法的结果(因此,您将获得在 java.lang.Object 本身中编写的默认实现。格式该字符串是:

binary-style-class-name@system-identity-hashcode.

[B 是二进制样式 class 名称。这是 byte[].

的 JVM-ese

cbf1911 是系统标识哈希码,它(高度过于简化,并不是真正可以用来查找东西的东西)基本上是内存地址。

不是那个字节数组的内容.

许多 java API 允许您传入任何对象,并且只会为您调用 toString。无论你在哪里做这件事,你都写了一个错误;您需要编写一些显式代码来将该字节数组转换为数据。

请注意,将字节转换为字符,无论何时需要将该字节数组放入基于字符的通信通道(例如 JSON 或电子邮件),都必须执行此操作,这很棘手。

<Buffer 6a 61 ...>

这是将每个字节列为一个无符号的十六进制半字节。这是一种非常低效的格式,但它完成了工作。

更好的选择是 base64。那只是非常低效(但并非非常低效);它花费 4 个字符来编码 3 个字节(相对于 node.js 花费 3 个字符来编码 1 个字节的东西)。 Base64 是一种广泛支持的标准。

编码时,需要明确写明。解码时,同样的故事。

在java中编码:

import android.util.Base64;

class Foo {
  void example() {
    byte[] array = ....;
    String base64 = Base64.encodeToString(array, Base64.DEFAULT);
    System.out.println(base64);
  }
}

该字符串通常是 'safe' - 它没有任何字符最终会被解释为控制流(因此没有 <、没有 " 等),并且是 100% ASCII,它倾向于在损坏的字符集编码转换中幸存下来,这在互联网上扔字符串时很常见。

你如何在node中解码base64?我不知道,但我确信网络搜索 'node base64 decode' 会提供数百个教程。

祝你好运!