我有一个在 C++ 和 Java 中返回字节数组的函数,该函数的逻辑是相同的。
鉴于返回的字节数组是相同的,当我在转换为基本字符串后打印数组时,例如:
std::string str(byteArray,byteArray+len)
我能够正确地看到输出,但是当我执行以下操作时:
new String(byteArray,"UTF-8")
我在终端上收到一些未知字符。如何检索与 C++ 相同的输出?
最佳答案
问题就在这里。当你这样做时:
new String(byteArray,"UTF-8")
你正在对运行时系统说:
The byte array contains character data that has been encoded as UTF-8. Convert it into a sequence of Unicode codepoints1 and give them to me as a Java
String
.
但是字节数组中的字节显然不是格式良好的 UTF-8 序列,因为你得到的东西看起来像垃圾。
所以这是怎么回事?我认为有两种可能性:
数组中的字节实际上可能是采用不同字符编码的字符。它显然不是 ASCII 数据,因为纯 7 位 ASCII 的格式也与 UTF-8 一样。但字节可以用其他一些字符编码进行编码。 (如果我们确实有字节值,我们也许能够对使用的编码进行有根据的猜测。)
数组中的字节实际上可能是乱码。你说它们是通过解密AES加密数据得到的。但是,如果您以某种方式解密不正确(例如,您使用了错误的 key ),那么您最终会得到乱码。
最后,Java 中与 std::string str(byteArray,byteArray+len)
最接近的等效项是:
new String(byteArray, "LATIN-1")
这是因为 LATIN-1 序列中的每个编码字节的值都等于等效的 Unicode 代码点。
目前还不清楚这是否真的适用于您的情况。当然,如果由于加密或解密不正确而导致字节乱码,那就不行了。或者加密数据在传输过程中出现乱码。
<小时/>1 - 实际上,UTF-16 代码单位 ...但那是另一个故事了。
关于java - 相当于java中C++基本字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49627690/