2

バイト配列があり、それを使用して文字列を作成しますnew String(array)。を使用してバイト配列に戻すと.getBytes()、元のバイト配列が返されません。何を与える?

String text = "two hats";
boolean t1 = Arrays.equals(text.getBytes(), text); // true

byte[] barray = {(byte)0x8f, (byte)0xd5, (byte)0xaf, (byte)0x30, (byte)0xb9};        

String test1 = new String(barray); 
boolean t2 = Arrays.equals(barray.getBytes(), test1); // false

// I tried setting an encoding but that didn't help.

Charset cs = Charset.forName("UTF-8"); 
String test2 = new String(barray, cs);       
boolean t3 = Arrays.equals(barray, test2, cs); // false

これが私が実際に使用しているコードです。

// test byte array vs string
public static void testEqual(byte[] bytes, String str) {
    byte[] fromString = str.getBytes();        

    printBytes(bytes);        
    printBytes(fromString);        
    System.out.println(Arrays.equals(bytes, fromString));        
}

// test byte array vs string, with charset
public static void testEqual(byte[] bytes, String str, Charset charset) {
    byte[] fromString = str.getBytes(charset);        

    printBytes(bytes);        
    printBytes(fromString);        
    System.out.println(Arrays.equals(bytes, fromString));
}

// prints bytes as hex string
public static void printBytes(byte[] bytes) {
    for (byte b: bytes) {
        System.out.print(String.format("%02X ", b));
    }        
    System.out.println();
}

public static void main(String[] args) {
    String text = "two hats";
    testEqual(text.getBytes(), text); // works fine

    byte[] barray = {(byte)0x8f, (byte)0xd5, (byte)0xaf, (byte)0x30, (byte)0xb9};        

    String test1 = new String(barray); // breaks      
    testEqual(barray, test1);

    Charset cs = Charset.forName("UTF-8"); // breaks too
    String test2 = new String(barray, cs);       
    testEqual(barray, test2, cs);
}

デモ: http://ideone.com/IRHlb

PS: Base64 などは使いたくない

4

1 に答える 1

4

プラットフォームのデフォルト エンコーディングを使用して任意のバイナリ データを文字列に変換することで、そのデータを保存しようとしているようです。そうしないでください。base64 または hex を使用して、任意のバイナリ データをテキストとして表現します。base64 変換用のクラスはたくさんあります。私はこのパブリックドメインのものを気に入っています。

データが実際テキストのバイナリ エンコード形式である場合は、そのエンコードを明示的に指定する必要がありますが、これは元のデータがテキストである場合にのみ適切です。(プラットフォームのデフォルトのエンコーディングを使用することは、ほとんどの場合、悪い考えです。)

バイナリデータとテキストデータは大きく異なります。不透明なバイナリ データを任意に文字列に変換することは、任意のファイルをイメージ エディターにロードして何か役立つものを表示できると期待するようなものです。

于 2012-10-09T17:34:24.610 に答える