繁体   English   中英

等效于Java中的C ++基本字符串

[英]Equivalent of C++ basic String in java

我有一个函数,它在C ++和Java中都返回字节数组,该函数的逻辑是相同的。

鉴于返回的字节数组是相同的,当我在转换成如下基本字符串后打印该数组时:

std::string str(byteArray,byteArray+len)

我能够正确看到输出,但是当我执行以下操作时:

new String(byteArray,"UTF-8")

我在终端上收到一些未知字符。 如何检索与C ++相同的输出?

这是问题所在。 执行此操作时:

    new String(byteArray,"UTF-8")

您对运行时系统说的是:

字节数组包含已编码为UTF-8的字符数据。 将其转换为Unicode代码点1的序列,并以Java String提供给我。

但是字节数组中的字节显然不是格式正确的UTF-8序列,因为您得到的东西看起来像垃圾。

那么发生了什么? 好吧,我认为有两种可能性:

  1. 数组中的字节实际上可以是采用不同字符编码的字符。 它显然不是ASCII数据,因为纯7位ASCII的格式也很正确,即UTF-8。 但是字节可以用其他字符编码来编码。 (如果实际上有字节值,我们也许可以对使用哪种编码做出有根据的猜测。)

  2. 数组中的字节实际上可能是乱码。 您说它们是通过解密AES加密数据获得的。 但是,如果您以某种方式使解密不正确(例如,使用了错误的密钥),那么最终将出现乱码。

最后,Java中与std::string str(byteArray,byteArray+len)最接近的等效项是:

  new String(byteArray, "LATIN-1")

这是因为LATIN-1序列中的每个编码字节的值都等于等效的Unicode代码点。

是否不清楚在您的情况下是否真的可行? 当然,如果字节由于错误的加密或解密而出现乱码,将无法正常工作。 或在传输过程中盗用加密数据。


1-实际上是UTF-16代码单元 ...但这是另一回事了。

在Java中,我将字节数组转换如下。 在您的情况下,此"UTF-8"可能会引起问题。

new String(byteArray);

也可以尝试

 new String(byteArray,"UTF-16");

如果以上两种方法均无效,则可以尝试以下方法:-

 UnicodeEncoding uEncoding = new UnicodeEncoding();
 string stringContent=uEncoding.GetString(byteArray);

另请参阅http://www.oracle.com/us/technologies/java/supplementary-142654.html

因此,解决方案来了,这里的问题是解密没有正确进行,不是完整而是部分,因此有些字符我们可以理解,其余字符都是垃圾,我做的错误是在加密时使用SHA-512作为消息摘要算法,在解密时使用MD-5

干杯!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM