2012-04-18 26 views
0

我將一個byte []數組轉換爲字符串。然後將字符串轉換回byte []數組。然後在檢查如果兩個數組相等, - 我讓他們不相等:
字符串到byte和viceversa在java中

byte[] ciphertext2=c.doFinal(username.getBytes("utf-8")); 
      //JUST CHECKING IGNORE 
      String qaz=new String(ciphertext2,"utf-8"); 
      //qaz=qaz+"1"; 
      System.out.println("just chekcing------------------------"+qaz); 
      byte[] ciphertext3=qaz.getBytes("utf-8"); 
      if(Arrays.equals(ciphertext2,ciphertext3)) 
      { 
      System.out.println("just chekcing they are equal------------------------"); 
      } 
      else 
      System.out.println("just chekcing they are not equal------------------------");<br> 

OUTPUT:

just chekcing they are not equal-------------------- 


爲什麼它不工作?
編輯
當使用java的Base64時,它工作得很好。但是,爲什麼直接將字節轉換爲字符串並反之亦然?將字符串轉換爲字節數組時實際發生了什麼?反之亦然?

+1

您的字節可能無效utf-8。當它們被解析爲utf-8字符串時,無效序列會變成有效的utf-8序列,因此字節數組是不同的。 Base64保證是有效的utf-8(它畢竟是ascii的超集)。 – bdares 2012-04-18 05:50:46

+0

@bdares:如何將字節數組轉換爲字符串?裏面會發生什麼? – Ashwin 2012-04-18 05:54:28

+0

如果我對用戶名的值進行了硬編碼,我會將其設置爲true。 – UVM 2012-04-18 05:57:57

回答

4

如果這是加密的結果,您應該使用字符串構造函數而不是。你沒有編碼文本 - 你有任意的二進制數據。您需要理解基本上是文本的數據和需要用二進制表示的數據(例如,將文本文件寫入磁盤)和基本上是二進制的數據之間的區別,以及需要用文本表示的數據(例如包括加密數據XML文檔)。

您應該使用base64(例如this public domain library)或十六進制。這將導致ASCII數據保證返回到原始二進制數據。

+0

如何將字節數組轉換爲字符串?裏面會發生什麼? – Ashwin 2012-04-18 05:57:34

+0

@Ashwin:它使用指定的任何編碼,如果沒有指定,則使用平臺默認值。編碼的全部要點是將字節轉換爲文本,反之亦然 - 它的工作原理取決於實現。例如,有一些簡單的編碼(例如ASCII),其中每個字節表示單個字符,反之亦然,但各種字節無效並且不能識別各種字符。但是用來構造字符串的二進制數據應該始終是一個字節序列,它可能是用相同編碼對某些文本進行編碼的結果。 – 2012-04-18 06:07:22

+0

所以,當你使用utf-8直接將字節數組轉換爲字符串時,將檢查字節數組中的每個字節,它在utf-8映射中具有對應的文本,並將相應的字節替換爲字符。如果映射不在utf-8中會發生什麼情況 - 就像我的情況那樣? – Ashwin 2012-04-18 06:20:12