2013-04-26 17 views
5

Dlaczego ten nieudany test kończy się niepowodzeniem?Bajt Java [] do/z Konwersja ciągów

import org.junit.Assert; 
import org.junit.Test; 

import java.io.UnsupportedEncodingException; 

public class TestBytes { 
    @Test 
    public void testBytes() throws UnsupportedEncodingException { 
     byte[] bytes = new byte[]{0, -121, -80, 116, -62}; 
     String string = new String(bytes, "UTF-8"); 
     byte[] bytes2 = string.getBytes("UTF-8"); 
     System.out.print("bytes2: ["); 
     for (byte b : bytes2) System.out.print(b + ", "); 
     System.out.print("]\n"); 
     Assert.assertArrayEquals(bytes, bytes2); 
    } 
} 

Przypuszczam, że przychodzące tablica bajtów wyrównał wynik, ale jakoś, prawdopodobnie ze względu na fakt, że UTF-8 znaków trwać dwa bajty, tablica wynik różni się od tablicy przychodzących zarówno w treści i długości.

Proszę mnie oświecić.

Odpowiedz

3

Powodem jest 0, -121, -80, 116, -62 nie jest prawidłową sekwencją bajtów UTF-8. new String (bajty, "UTF-8") nie wyrzuca żadnego wyjątku w takich sytuacjach, ale wynik jest trudny do przewidzenia. Przeczytaj http://en.wikipedia.org/wiki/UTF-8Sekwencje nieprawidłowych bajtów sekcja.

+0

Zwłaszcza kodowanie UTF-8 nie może reprezentować wszystkich sekwencji bajtów. –

+0

Dzięki. Bardzo chciałbym przechowywać te bajty w łańcuchu. Czy są jakieś kodowania, które obsługują sekwencje _any_ bajtów, czy też muszę je reprezentować w ten sam sposób, w jaki wydrukowałem go w powyższym teście na jedną z nich? – eirirlar

+2

Wypróbuj ISO-8859-1 konwertuje bajty na znaki 1 do 1 –

1

Bajty tablicowe zawierają wartości ujemne, które mają zestaw 8 bitów (bit7) i są konwertowane na UTF-8 jako sekwencje wielobajtowe. bajt2 będzie identyczny z bajtami, jeśli użyjesz tylko bajtów o wartościach z zakresu 0..127. Aby utworzyć kopię bajtów, można zastosować na przykład metodę arraycopy:

byte[] bytes3 = new byte[bytes.length]; 
    System.arraycopy(bytes, 0, bytes3, 0, bytes.length); 
+0

Dzięki za wyjaśnienia na temat 8-tego bit. – eirirlar