簡體   English   中英

Java String到byteArray的轉換問題

[英]Java String to byteArray conversion issue

我正在嘗試將ByteArray編碼/解碼為String ,但輸入/輸出不匹配。 難道我做錯了什么?

System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(by));
String s = new String(by, Charsets.UTF_8);
System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(s.getBytes(Charsets.UTF_8)));

輸出是:

130021000061f8f0001a
130021000061efbfbd

完整代碼:

String[] arr = {"13", "00", "21", "00", "00", "61", "F8", "F0", "00", "1A"};        
byte[] by = new byte[arr.length];

for (int i = 0; i < arr.length; i++) {
    by[i] = (byte)(Integer.parseInt(arr[i],16) & 0xff); 
}

System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(by));

String s = new String(by, Charsets.UTF_8);
System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(s.getBytes(Charsets.UTF_8)));

這里的問題是f8f0001a不是有效的UTF-8字節序列。

首先, f8開放字節表示一個5字節的序列,而你只有四個。 其次, f8后面只能跟一個8x9xaxbx格式的字節。

因此它被替換為unicode replacement character (U+FFFD) ,其UTF-8中的字節序列是efbfbd

並且(正確地)不能保證將無效字節序列轉換為字符串和從字符串轉換將導致相同的字節序列。 (請注意,即使有兩個看似相同的字符串,您可能會在Unicode中獲得表示它們的不同字節,請參閱Unicode等效 。)

故事的寓意是:如果要表示字節,不要將它們轉換為字符,如果要表示文本,請不要使用字節數組。

我的UTF-8有點生銹:-),但序列F8 F0不是有效的utf-8編碼。

請查看http://en.wikipedia.org/wiki/Utf-8#Description

從字節數組構建String ,將解碼字節。

由於代碼中的字節不代表有效字符,因此最終組成String的字節與您作為參數傳遞的字節不同。

public String(byte [] bytes)

通過使用平台的默認字符集解碼指定的字節數組構造一個新的String String的長度是字符集的函數,因此可能不等於字節數組的長度。

未指定給定字節在默認字符集中無效時此構造函數的行為。 當需要更多地控制解碼過程時,應該使用CharsetDecoder類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM