簡體   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