2011-11-15 26 views
1

我花了一整天的時間試圖找到答案,所以最後我寫在這裏。 我使用類加密函數對一個字符串進行加密,然後得到一個字節[]。 我必須將字符串中的此字節與tostring()進行轉換,才能在一個Web上進行上傳。 我需要得到這個字符串,解密並獲取原始字符串。 我的問題是關於getBytes,不返回相同的字節[]解密。方法字符串到字節

我需要將原始字符串轉換爲byte [],進行加密,得到返回的字節[],轉換爲字符串,然後將此字符串轉換爲byte []並獲得相同的字節[]加密。

我嘗試了一切它在我腦海中。 我需要一個方法,使用一個字符串,返回總是相同的字節[]和getbytes不這樣做。

我添加一個例子:

 String s2="this is an example"; 
     byte[] b1=s2.getBytes("UTF-8"); 
     byte[] b2=s2.getBytes("UTF-8"); 
     System.out.println("Byte s:"+b1); 
     System.out.println("Byte s:"+b2); 

有一個方法,從一個字符串中給出相同的字節[]? 用getBytes(至少在我)我得到兩個不同的字節[]。 謝謝。

+0

對不起,但是您的問題很難遵循,可能是由於英語不是您的母語。你可以發佈一些代碼,顯示你在做什麼,以及你正在做什麼,這不是你想要的嗎? –

+0

從byte []到String的解碼時使用什麼字符集,以及從String到byte []編碼時使用什麼字符集?您必須爲兩者使用相同的字符集,否則您可能無法獲取原始字節[]。 –

+0

這不是我的母語,對不起。 我發表了一個關於我的問題的例子。 如果我寫這個: String s =「這是一個例子」; byte [] b1 = s.getBytes(「UTF-8」); byte [] b2 = s.getBytes(「UTF-8」); System.out.println(「Byte s:」+ b1); System.out.println(「Byte s:」+ b2); 我得到兩個不同的字節。我需要一個字符串我得到一個字節[],一個對稱關係字節[] - >字符串 - >字節[]與兩個字節等於。 我嘗試了所有的字符集,默認情況下,UTF-8 ...和我一樣關心編碼和解碼。 謝謝你們兩位。 – Jmm

回答

2

你需要使用String#getBytes(charsetName)這需要一個特定的字符編碼。

byte[] bytes = string.getBytes("UTF-8"); 
// ... 

然後,重建字符串,你需要使用String(bytes, charsetName)構造,這需要特定的字符編碼。

String string = new String(bytes, "UTF-8"); 
// ... 

否則,平臺默認字符編碼將用於將字符串的字符解碼爲字節。所有平臺上的平臺默認字符編碼不一定相同。例如,一個平臺可以使用UTF-8,而另一個平臺使用CP1252或ISO-8859-1。

或者,您可以使用Base64將字節編碼/解碼爲US-ASCII兼容字符串,以便與世界上幾乎所有體面編碼字符兼容。

+0

我試過這個方法getBytes,我遇到了問題。 我會嘗試base64,謝謝。 – Jmm

+0

那麼你的問題是其他地方引起的,可能無法通過Base64解決。如果沒有SSCCE從你身邊找到問題的原因是不可能的。我最好的猜測是字符串反過來用錯誤的編碼寫在網絡上。也許你正在使用'Writer'而沒有將它封裝在'OutputStreamWriter'中,或者不用'將'string.getBytes(「UTF-8」)'寫入'OutputStream'。 – BalusC

2

我有這個字節的字符串轉換與toString()方法,在一個網絡

不,你不上傳。您可以上傳字節,事實上字節是您可以通過HTTP發送的唯一信息。在某些時候,你的字符串將被轉換回字節,爲什麼不跳過額外的轉換,只會損壞你的數據?

+0

因爲它是由庫指定的,所以我使用字符串上傳。 – Jmm

1

您是否嘗試過重新創建字符串並通過明確指定編碼從中獲取字節?

final String newString = new String(bytes, utf8_charset); 
final byte[] bytes = oldString.getBytes(utf8_charset); 
0

該問題可能發生,因爲JDK無法正確識別字符集。 使用聲明:

public byte[] getBytes(String charsetName) 

指定要使用的字符集。這可能有幫助。我沒有看到爲什麼它會返回一個不同的字節數組。

2

是否可以省略轉換爲字符串?我的意思是,你可以發送字節[]並接收字節[]。或者你可以使用base64(它產生一系列可打印的字符)對byte []進行編碼,將其作爲字符串發送,然後從base 64解碼並獲得原始字節[]。

+0

不可以省略轉換,因爲我使用庫來上傳信息,而且需要一個字符串。 關於使用base64編碼字節[]我沒有嘗試,也許它的作品。 謝謝 – Jmm

3

你誤會以下行

System.out.println("Byte s:"+b1); 

在這裏,我們都隱含調用字節數組的toString()方法。這不是而是返回數組的內容。而是使用:

System.out.println("Byte s:" + java.util.Arrays.toString(b1)); 

這將顯示你的字節數組,你可以用你的比較的內容。

您使用String.getBytes(String)方法很好。它返回兩個不同的字節數組實例但它們都具有相同的內容。

@Test 
public void testGetBytes() throws Exception { 
    String s2 = "this is an example"; 

    byte[] b1 = s2.getBytes("UTF-8"); 
    byte[] b2 = s2.getBytes("UTF-8"); 

    Assert.assertEquals(b1, b2); 
}