2011-03-31 146 views
14

我有一個字節數組,我正在加密,然後轉換爲一個字符串,以便可以傳輸。當我收到字符串時,我必須將字符串轉換回字節數組,以便解密。我已經檢查過收到的字符串與發送的字符串(包括長度)匹配,但是當我使用類似str.getBytes()的字符串將其轉換爲字節數組時,它與我的原始字節數組不匹配。將Java字符串轉換爲字節數組

示例輸出:

SENT: WzShnf/fOV3NZO2nqnOXZbM1lNwVpcq3qxmXiiv6M5xqC1A3 
SENT STR: [[email protected] 
RECEIVED STR: [[email protected] 
RECEIVED: W0JAM2U0YTlhN2Q= 

任何想法如何我可以將所接收的字符串轉換爲字節陣列所發送的字節數組匹配?

感謝

+3

函數用於轉換字符串的字節數組使用: 字符串stringToConvert =「這個字符串長度爲76個字符,將被轉換爲一個字節數組」。 byte [] theByteArray = stringToConvert.getBytes(); – 2011-03-31 12:39:15

+1

W0JAM2U0YTlhN2Q =是[B @ 3e4a9a7d的Base64,它看起來像是Java中字節數組的字符串表示。如果您自己正在執行字節操作,請仔細檢查它,因爲您可能正在發送錯誤的數據。 – mdrg 2011-03-31 12:41:41

+0

out是我的字節數組,打印時給出了我的示例輸出的第一行。 out.toString()肯定給我[B @ 3e4a9a7d – Mitch 2011-03-31 12:57:41

回答

16

您使用array.toString(),它是這樣實現的:

return "[[email protected]" + Integer.toString(this.hashCode(), 16); 

(事實上,它繼承對象的定義,以及@之前根本的getClass().getName()結果的部分)

而且這裏的hashCode不依賴於內容。

而是使用新的String(數組,編碼)。

當然,這隻適用於真正表示爲Java字符串(其中包含可讀字符)的字節數組,而不適用於任意數組。最好使用像Bozho推薦的base64(但確保在通道的兩側都使用它)。

+0

謝謝,這是對問題的快速解決方案 – Mitch 2011-04-02 00:36:19

5

這看起來像Base64編碼。看看commons-codecBase64課。

+0

我曾嘗試使用sun.misc.BASE64Decoder,我認爲它非常相似,它似乎並沒有爲我工作 – Mitch 2011-03-31 12:39:36

+1

@Mitch嘗試'string.getBytes(「ISO-8859-1 「)',然後將其作爲構造函數來傳遞。 – Bozho 2011-03-31 12:42:56

+2

@Mitch不使用'sun。*'包中的任何類。他們是專有的API,可能隨時被刪除。使用任何其他公共實現,比如Bozho建議的實現。 – mdrg 2011-03-31 12:46:59

4

由於getBytes使用plattform的默認字符集,所以不能在兩個不同的機器上使用getBytes()。

使用指定的字符集(即UTF-8)對數組進行解碼和編碼,以確保獲得正確的結果。

1

首先做你的字節數組正確的琴絃的皈依,通過做

String line= new String(Arrays.toString(your_array)) 

然後把它和使用下面

public static byte[] StringToByteArray(String line) 
{ 

    String some=line.substring(1, line.length()-1);  
    int element_counter=1; 

    for(int i=0; i<some.length(); i++) 
    {   
     if (some.substring(i, i+1).equals(",")) 
     { 
      element_counter++; 
     }  

    } 
    int [] comas =new int[element_counter-1]; 
    byte [] a=new byte[element_counter]; 
    if (a.length==1) 
    { 
     a[0]= Byte.parseByte(some.substring(0)); 
    }  
    else 
    { 
     int j=0; 
     for (int i = 0; i < some.length(); i++) 
     { 
      if (some.substring(i, i+1).equals(",")) 
      { 
       comas[j]=i; 
       j++; 
      } 
     }   
     for (int i=0; i<element_counter; i++) 
     { 
      if(i==0) 
      { 
       a[i]=Byte.parseByte(some.substring(0, comas[i])); 
      } 
      else if (i==element_counter-1) 
      { 
       a[i]=Byte.parseByte(some.substring(comas[comas.length-1]+2)); 
      } 
      else 
      { 
       a[i]=Byte.parseByte(some.substring(comas[i-1]+2, comas[i])); 
      } 

     } 
    } 
    return a; 

} 
相關問題