2013-04-26 62 views
5

Bu deneme testi neden başarısız?Java bayt [] to/from Dize dönüştürme

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

Gelen bayt dizisi sonucunu eşit olduğunu varsayalım, ama muhtemelen UTF-8 karakter iki bayt almak gerçeğine nasılsa, sonuç dizisi içerik ve uzunluk hem de gelen diziden farklıdır.

Lütfen beni aydınlatınız.

cevap

3

nedeni 0, -121, -80, 116, -62 geçerli bir UTF-8 bayt sırası olmadığı. Yeni String (bayt, "UTF-8") bu gibi durumlarda herhangi bir istisna atmaz, ancak sonucun tahmin edilmesi zordur. Oku http://en.wikipedia.org/wiki/UTF-8Geçersiz bayt dizileri bölümü.

+0

Özellikle UTF-8 tüm bayt dizilerini temsil edemez. –

+0

Teşekkürler. Bu baytları bir String içinde depolamayı çok isterim. _any_ bayt dizilerini destekleyen herhangi bir kodlama var mı, yoksa yukarıdaki junit testinde yazdığım şekilde mi temsil etmeliyim? – eirirlar

+2

ISO-8859-1'i deneyin, baytları 1'e 1'e dönüştürür –

1

dizi bayt içeren negatif belirtildiği valflann bu 8. biti (7. bitini) ayarlanmış ve baytlı diziler gibi UTF-8 dönüştürülür. Yalnızca baytları 0..127 aralığındaki değerlerle kullanırsanız, bytes2 baytlarla aynı olacaktır. Örneğin, verilen baytların bir kopyasını yapmak için örneğin dize yöntemi kullanılabilir:

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

8 bit hakkında açıklama için teşekkürler. – eirirlar