2009-12-20 29 views
9

Okuma baytları gerektiren ve dizeler oluşturma konusunda bir şeyler üzerinde çalışmaya başlamak üzereyim. Okunan baytlar UTF-16 dizelerini temsil eder. Sadece bir şeyleri test etmek için UTF-16 kodlamasında basit bir bayt dizisini bir dizeye dönüştürmek istedim. Dizideki ilk 2 bayt, endianlığı temsil etmeli ve 0xff 0xfe veya 0xfe 0xff olmalıdır.Java örtülü bayt için örtük dönüşümü

byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00}; 

Ama 0XFF ve 0xFE (bayt Java imzalanan çünkü) bir bayt sığmayacak kadar büyük olduğu için ben bir hata var: Ben şöyle benim bayt dizisi oluşturma çalıştı. Daha doğrusu hata, int'nin bir byte dönüştürülememesiydi. Ben sadece int ve bayttan bir alçı ile açıkça dönüştürebildiğimi ve istenen sonuca ulaşabileceğimi biliyorum, ama bu benim sorumun konusu değil.

Sadece bir şey denemek için bir Dize oluşturdum ve getBytes ("UTF-16") olarak adlandırdım ve dizideki her bayttan birini bastım. Çıktı biraz kafa karıştırıcıydı çünkü ilk iki bayt 0xFFFFFFFE 0xFFFFFFFF, ardından 0x00 0x52 0x00 0x6F idi. (Buradaki enderlik, yukarıda yaratmaya çalıştığımdan farklıdır, fakat bu önemli değildir). Ben denemek ve benim bayt dizisi aynı şekilde oluşturmaya karar bu çıkışı kullanarak

:

byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00}; 

Ve garip iyi çalıştı. Bu yüzden benim sorum, Java'nın neden 0xFFFFFF80 veya daha büyük bir tamsayı değerine izin vermesi, açık bir döküm olmadan otomatik olarak bir bayta dönüştürülmesine izin veriyor, ancak 0x80 değerine eşit veya daha büyük bir şey açık bir döküm gerektiriyor mu?

cevap

10

Burada hatırlanması gereken önemli nokta, Java'daki int imzasıdır. 0xffffffff (2^32 -1 olan) atandığınızda, bu, -1 işaretli bir int değerine dönüştürülür - bir int, 0xffffffff gibi büyük bir değeri pozitif bir sayı olarak temsil edemez.

Bu nedenle, 0x80'den küçük ve 0xFFFFFF80'den büyük değerler için, ortaya çıkan int değeri, -128 ve 127 arasındadır; bu, net olarak byte olarak gösterilebilir. Bu aralığın dışında bir şey olamaz ve süreçte veri kaybetmek, açık bir döküm ile zorlamak gerekir.

+0

Teşekkürler, bu daha net hale getirir. – DaveJohnston

2

İpucu içermeyen bir sayı kullanırsanız (örneğin, uzun bir süre için 1234L), derleyici bir tam sayı alır. 0xffffffff değeri, -1 değerine sahip bir tam sayıdır ve byte no'lu bir uyarı olmadan yayınlanabilir.

+1

... Çünkü Java, negatif değerler için iki numaralı notasyon kullanır. – Ash

0

Çünkü 0xffffffff -1 sayısıdır ve -1 bayt olarak yorumlanabilir.

0

0xff, 0x000000ff, 0xffffffff değil ile aynıdır. Yani bu senin meselenin; tamsayı pozitif bir sayıdır (255), ancak bayt (bit için dönüştürülmüşse) negatif bir sayıdır (-1). Ancak 0xffffffff, her ikisi de int ve byte olarak kullanılır.

0

int imzalı olduğundan ve 0xffffffff -1 değerini temsil ettiğinden ve 0xff bir baytın -128 (0x80) +127 (0x7f) aralığına sığmayan 255 değerinde bir tamsayıyı temsil ettiğinden.

İlgili konular