2013-07-16 16 views
6

Herhangi bir dosya türünü şifreleyen küçük bir Java programı yapıyorum. Yaptığım şey şu şekildedir: Giriş dosyasını açın, bu dosya ile aynı boyutta bir bayt dizisinde okuyun, sonra kodlamayı yapın ve tüm diziyi çıktı olarak adlandırılan bir .dat dosyasına yazın. dat. Bayt dizisini dizine eklemek için int türünde bir değişken kullanıyorum. Kod:Java hatası: olası hassasiyet kaybı

 for(int i : arr) { 
      if(i>0) { 
       arr[i] = arr[i-1]^arr[i]; 
      } 
     } 

'arr', giriş dosyasıyla aynı boyutta bir bayt dizisidir.

Elde hatası: CodingEvent.java:42: hatası: hassas olası kaybı

dizi [i] = dizi [I-1] '^ arr [i];

(^ operatör üzerinde bir ok lekeler)

gerekli: bayt

bulunan:

nesi var int? Bana yardım edebilir misiniz, lütfen?

cevap

7

byte^byte sonucu, karşı-sezgisel olarak, int. Operatör işlenenlerinden üzerinde binary numeric promotion yapıyor olarak tanımlanır ve çünkü

arr[i] = (byte)(arr[i-1]^arr[i]); 

Bu ne yani gerçekten (bu durumda) yapıyor edilir: arr[i] geri atanırken ifadenin sonucuna bir döküm kullanın : doğal olarak int sonuçlanır

arr[i] = (int)arr[i-1]^(int)arr[i]; 

.... Bu yüzden geri dönüşe ihtiyacımız var.

1

^ işleçlerinin işlenenleri ilk olarak converted to an int'dur (buna ikili sayısal tanıtım denir). Dolayısıyla, byte s (arr[i-1] ve arr[i]), int'a dönüştürülür ve işlemin sonucu da int olur.

arr[i] ürününe atamak için sonucu byte sonucuna geri göndermeniz gerekir.

+1

LOL! İkimiz de ikili sayısal dönüşüme başvurduk. Bu sadece çok geeky. –

0

işte sorun bu daha sonra tip byte [] taşımaktadır [] arr java tamsayılar ile herhangi bir ikili işlem yaptığında, bu operatörlerin bağlı bir int veya uzun kalmamak döndürür. Bu durumda arr [i-1]^arr [i], bayt'da depolamaya çalıştığınız bir int sonucudur.

0

JLS 15.22.1

When both operands of an operator &, ^, or | are of a type that is convertible (§5.1.8) to a primitive integral type, binary numeric promotion is first performed on the operands (§5.6.2).

bak ve JLS 5.6.2

1.If any operand is of a reference type, it is subjected to unboxing conversion (§5.1.8).

2.Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:

  1. If either operand is of type double, the other is converted to double.

  2. Otherwise, if either operand is of type float, the other is converted to float.

  3. Otherwise, if either operand is of type long, the other is converted to long.

  4. Otherwise, both operands are converted to type int.

Bu nedenle aşağıdaki sentezleme önce bir int dönüştürülür.

arr[i-1]^arr[i]; 

, byte geri döküm açık döküm kullanmak için:

arr[i] = (byte)(arr[i-1]^arr[i]);