2012-03-30 36 views
1

我從我認爲是一個簡單的測試中獲得了一些意想不到的結果。運行後如下:Java:字符串到字節數組的轉換

byte [] bytes = {(byte)0x40, (byte)0xE2, (byte)0x56, (byte)0xFF, (byte)0xAD, (byte)0xDC}; 
String s = new String(bytes, Charset.forName("UTF-8")); 
byte[] bytes2 = s.getBytes(Charset.forName("UTF-8")); 

bytes2是一個14個元素的長數組,沒有什麼像原來的(字節)。有沒有辦法做這種轉換並保留原始分解爲字節?

+1

作爲一個普遍的觀點,你說「字節2爲[...]完全不像原來的」 - 它會仍然是有用的,包括它的問題。 – 2012-03-30 22:06:52

+0

哪個版本的Java? – 2012-03-30 22:07:54

回答

4

有沒有辦法做這種轉換並保留原始分解爲字節?

那麼這看起來不像對我有效的UTF-8,所以我並不感到驚訝,它沒有往返。

如果要將任意二進制數據轉換爲文本,請使用base64(例如,通過this public domain encoder/decoder

+0

Skeet必須是它。 「這個方法總是用這個字符集的默認替換字節數組替換畸形輸入和不可映射字符序列。爲了檢測這些序列,直接使用CharsetDecoder.decode(java.nio.ByteBuffer)方法。」 (http://docs.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html#decode(java.nio.ByteBuffer)) – 2012-03-30 22:21:38

1

兩件事情:

  1. 字節序列不似乎是有效的UTF-8

    $ python 
    >>> '\x40\xe2\x56\xff\xad\xdc'.decode('utf8') 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
        File "/usr/lib64/python2.7/encodings/utf_8.py", line 16, in decode 
        return codecs.utf_8_decode(input, errors, True) 
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 1: invalid continuation byte 
    
  2. 即使它是有效的UTF-8,解碼和再編碼可導致由於預先組合的字符和其他Unicode功能等不同的字節。

如果你想在一個字符串編碼在保證您得到相同的字節回來時,你對它們進行解碼的方式任意的二進制數據,最好的辦法是類似的base64。

2

這應該這樣做:

public class Main 
{ 

    /* 
    * This method converts a String to an array of bytes 
    */ 
    public void convertStringToByteArray() 
    { 

     String stringToConvert = "This String is 76 characters long and will be converted to an array of bytes"; 

     byte[] theByteArray = stringToConvert.getBytes(); 

     System.out.println(theByteArray.length); 

    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    {  
     new Main().convertStringToByteArray(); 
    } 
} 
相關問題