[英]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.