[英]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序列,因为您得到的东西看起来像垃圾。
那么发生了什么? 好吧,我认为有两种可能性:
数组中的字节实际上可以是采用不同字符编码的字符。 它显然不是ASCII数据,因为纯7位ASCII的格式也很正确,即UTF-8。 但是字节可以用其他字符编码来编码。 (如果实际上有字节值,我们也许可以对使用哪种编码做出有根据的猜测。)
数组中的字节实际上可能是乱码。 您说它们是通过解密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.