2012-03-30 6 views
1

Ich bekomme einige unerwartete Ergebnisse von dem, was ich dachte, war ein einfacher Test. Nach dem Ausführen der folgenden:Java: String zu Byte-Array-Konvertierung

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 ist ein 14-Elemente langes Array nichts wie das Original (Bytes). Gibt es eine Möglichkeit, diese Art von Konvertierung durchzuführen und die ursprüngliche Dekomposition in Bytes zu behalten?

+1

Als allgemeinen Punkt, sagen Sie „bytes2 ist [...] nichts wie das Original“ - es immer noch nützlich sein, würde es in der Frage aufzunehmen. –

+0

Welche Version von Java? –

Antwort

4

Gibt es eine Möglichkeit, diese Art von Konvertierung durchzuführen und die ursprüngliche Dekomposition in Bytes zu behalten?

Nun, das sieht für mich nicht wie gültiges UTF-8 aus, also bin ich nicht überrascht, dass es keine Hin- und Rückfahrt war.

Wenn Sie beliebige binäre Daten in reversiblen Text konvertieren möchten, verwenden Sie base64, z. über this public domain encoder/decoder.

+0

Skeet das muss es sein. "Diese Methode ersetzt immer falsch formatierte Eingabe- und nicht maskierbare Zeichenfolgen durch das standardmäßige Ersatz-Byte-Array dieses Zeichensatzes. Um solche Sequenzen zu erkennen, verwenden Sie direkt die Methode CharsetDecoder.decode (java.nio.ByteBuffer)." (http://docs.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html#decode(java.nio.ByteBuffer)) –

1

Zwei Dinge:

  1. Die Byte-Sequenz erscheint nicht gültig 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. Selbst zu sein, wenn es gültige UTF-8, Dekodierung und dann kann codiert, führen war in verschiedene Bytes aufgrund von Vorzeichen und anderen Unicode-Funktionen.

Wenn Sie in einer Zeichenkette in einer Art und Weise beliebige binäre Daten codieren, in dem Sie die gleichen Bytes zurück sind garantiert, wenn man sie entschlüsseln, Ihre beste Wette ist so etwas wie base64.

2

sollte dies tun:

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(); 
    } 
}