2012-03-04 85 views
2

我是Java初學者,我有我需要轉換爲字符串的字節數組。
之後,我想把它從字符串改回字節數組。
我嘗試下面的代碼,但由於從2號線的返回值沒有工作原始數組不匹配:將字節數組轉換爲字符串,然後再將其返回到字節數組

byte[] comData = byteArray; 
String value = new String(comData); 
byte[] comData2 = value.getBytes(); 
// comData2 does not equal comData 
+0

:)這只是一個示例介紹瞭如何轉換我的,肯定comData會在真實情況下不可用:) – Mtaraby 2012-03-04 19:12:01

+1

你如何比較兩個陣列? – 2012-03-04 19:12:10

回答

5

如果這是一個任意收集字節,也就是說,它是不實際上編碼的文本,那麼我建議你使用base64。有一個public domain library available,這使得它很容易(或各種其他第三方庫)。

示例代碼:

byte[] originalData = ... 
String base64 = Base64.encode(myByteArray); 
byte[] decoded = Base64.decode(base64); 

您的原始代碼假定該數據代表了平臺默認的編碼編碼的文本。你應該使用平臺默認的編碼幾乎總是避免 - 如果你要使用文本編碼,它通常是最好指定一個,例如

byte[] encodedText = text.getBytes("utf-8"); 

(當然,如果你是解碼二進制數據,那麼你就不能選擇的編碼 - 你需要知道使用的編碼)。

0

這是一個有點奇怪的是返回的數組與原始數據不匹配。但是,可能會有一些細微的字符編碼問題。嘗試指定一個明確的編碼爲字節,例如:

byte[] comData = byteArray; 
String value = new String(comData, "UTF-8"); 
byte[] comData2 = value.getBytes("UTF-8"); 

System.out.println(Arrays.equals(comData, comData2) ? "Success" : "Failure"); 

既然你說你是Java初學者,但值得注意的是,你不能使用==.equals()比較兩個數組。這兩個測試數組是否是相同的對象,而不是它們是否具有相同的內容。

+0

如果它不是* UTF-8編碼的數據,指定UTF-8是一個壞主意。有很多字節序列,它們不是有效的UTF-8。 – 2012-03-04 19:29:16

+0

@JonSkeet UTF-8就是一個例子,OP應該使用與數據相關的任何編碼。當然,如果這些字節根本不是字符數據,那麼使用類似base 64的字符編碼字節(正如您在答案中所建議的那樣)就是要走的路。 – 2012-03-04 19:45:34

0

試試這樣:

byte[] comData = byteArray; 
String value = new String(); 
for(byte me : comData) 
{ 
    value += (char)me; 
} 
byte[] comData2; 
{ 
    List<byte> temp; 
    for(int i=0; i<value.size(); i++)//it may be value.length(), I don't remember 
    { 
     temp.add(byte(value.getChar(i))); 
    } 
} 
comData2 = temp.getArray(); 
} 

您遇到的主要問題是,您嘗試使用字節值作爲構造器...,然後將字符串轉換爲字節。 你應該把它轉換成char和使用簡單的鑄造,在這種情況下,它將是相同的0和1s。

注意,因爲我不把所有在我的腦海中的Java API有些名稱可能會有所不同;)

+1

字節和字符之間不一定有1-1對應關係。 – 2012-03-04 19:11:23

+0

是的,但直接投射會使其保持完整,目標不是打印字符串,而是將其暫時保存在字符串中。 – 2012-03-04 19:12:38

+0

如果目標確實是打印出字符串,那麼Base64就是要走的路。 – 2012-03-04 19:12:50

相關問題