我是Java初學者,我有我需要轉換爲字符串的字節數組。
之後,我想把它從字符串改回字節數組。
我嘗試下面的代碼,但由於從2號線的返回值沒有工作原始數組不匹配:將字節數組轉換爲字符串,然後再將其返回到字節數組
byte[] comData = byteArray;
String value = new String(comData);
byte[] comData2 = value.getBytes();
// comData2 does not equal comData
我是Java初學者,我有我需要轉換爲字符串的字節數組。
之後,我想把它從字符串改回字節數組。
我嘗試下面的代碼,但由於從2號線的返回值沒有工作原始數組不匹配:將字節數組轉換爲字符串,然後再將其返回到字節數組
byte[] comData = byteArray;
String value = new String(comData);
byte[] comData2 = value.getBytes();
// comData2 does not equal comData
如果這是一個任意收集字節,也就是說,它是不實際上編碼的文本,那麼我建議你使用base64。有一個public domain library available,這使得它很容易(或各種其他第三方庫)。
示例代碼:
byte[] originalData = ...
String base64 = Base64.encode(myByteArray);
byte[] decoded = Base64.decode(base64);
您的原始代碼假定該數據代表了平臺默認的編碼編碼的文本。你應該使用平臺默認的編碼幾乎總是避免 - 如果你做要使用文本編碼,它通常是最好指定一個,例如
byte[] encodedText = text.getBytes("utf-8");
(當然,如果你是解碼二進制數據,那麼你就不能選擇的編碼 - 你需要知道向使用的編碼)。
這是一個有點奇怪的是返回的數組與原始數據不匹配。但是,可能會有一些細微的字符編碼問題。嘗試指定一個明確的編碼爲字節,例如:
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()
比較兩個數組。這兩個測試數組是否是相同的對象,而不是它們是否具有相同的內容。
如果它不是* UTF-8編碼的數據,指定UTF-8是一個壞主意。有很多字節序列,它們不是有效的UTF-8。 – 2012-03-04 19:29:16
@JonSkeet UTF-8就是一個例子,OP應該使用與數據相關的任何編碼。當然,如果這些字節根本不是字符數據,那麼使用類似base 64的字符編碼字節(正如您在答案中所建議的那樣)就是要走的路。 – 2012-03-04 19:45:34
試試這樣:
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對應關係。 – 2012-03-04 19:11:23
是的,但直接投射會使其保持完整,目標不是打印字符串,而是將其暫時保存在字符串中。 – 2012-03-04 19:12:38
如果目標確實是打印出字符串,那麼Base64就是要走的路。 – 2012-03-04 19:12:50
:)這只是一個示例介紹瞭如何轉換我的,肯定comData會在真實情況下不可用:) – Mtaraby 2012-03-04 19:12:01
你如何比較兩個陣列? – 2012-03-04 19:12:10