2014-12-26 16 views
6

farklı sonuçlar verir: bir dahaDöküm int OP'sinden bir yoruma göre NetBeans ve JCreator

benim Java programları geliştirmek NetBeans kullanmak üretilemeyen ve onlar mükemmel çalışır. Ama programımın JAR dosyasını oluşturduğumda, aynı girdi için farklı çıktılar veriyor.

Ben sert zaman hata ayıklama vardı ve ben JCreator aynı kod

[0; 256) iken NetBeans ben hep aralık [-128; 128) yapabilirsiniz nasıl [-128; 128) içinde byte için sonuç aralıkları int döküm bulmuşlardır ?

private static byte[] convertHexString(String ss) { 
    try{ 
     byte digest[] = new byte[ss.length()/2]; 
     for (int i = 0; i < digest.length; i++) { 
      String byteString = ss.substring(2 * i, 2 * i + 2); 
      int byteValue = Integer.parseInt(byteString, 16); 
      digest[i] = (byte) byteValue; 
     } 
     // Test 
     for(int i = 0; i < digest.length; ++i){ 
      System.out.println(digest[i]); 
     } 

     return digest; 
    } 
    catch(Exception e){ 
     return null; 
    } 
} 
+1

127 JCreator bir hata (biz [bu] bahsediyoruz (http://jcreator.com) benziyor, sağ ?); bayttan int'ye ("println()") "upcasting" yaparken, işaret bitini gerektiği gibi taşımamaktadır, sonuçlarınız – fge

+0

Not Only (JCreator) değil, aynı zamanda normal Windows ortamında da. Windows'da (JAR) dosyasını çalıştırdığımda, (JCreator) ile aynı sonucu verdi. – 0FiRE0

+0

Ve JDK'niz nedir? Oracle'ın mı? – fge

cevap

2

Kesinlikle bir hataya benziyor. 0 değil İşte 255.

için -128 ile 127 A byte aralıkları, bunun yerine 255 yazdırır nerede -1 (yani 0xff), bir bayt değeri ile oluyor düşünüyorum budur:

public static void main(final String... args) 
{ 
    final ByteBuffer buf = ByteBuffer.allocate(4); 

    // What Java would do on casting... 
    buf.put((byte) 0xff); 
    buf.put((byte) 0xff); 
    buf.put((byte) 0xff); 
    buf.put((byte) 0xff); 

    buf.rewind(); 

    System.out.println(buf.getInt()); // -1 -- good 

    buf.rewind(); 

    // What JCreator seems to do on casting... 
    buf.put((byte) 0); 
    buf.put((byte) 0); 
    buf.put((byte) 0); 
    buf.put((byte) 0xff); 

    buf.rewind(); 

    System.out.println(buf.getInt()); // 255 -- WRONG 
} 

Yani, bayttan int'ye "yayın" yapıldığında, kullandığınız Java derleyicisi ne olursa olsun, JLS'nin yapması gereken şeyi yapmaz, yani işaret bitini taşır.

Kullandığınız derleyicinin/koşucunun, bu nedenle de komut satırında JDK'nın JDK olduğundan şüphe ediyorum.

(a PrintStreama method to print an int sahiptir, ama bir byte dikkat nedenle bayt int yükseltildikten)

+0

Çıktı: -1 255. hem (NetBeans) hem de (JCreator). – 0FiRE0

+0

Eh, bu normal, bu testi yaptım; Her birinin üstündeki yorumlara dikkatlice bak – fge

1
byte [] 'den değer (println düzgün dönüştürülmez gibi görünmektedir

Her neyse, beklediğiniz gibi değil ve JLS buna sahip).

kullanabilirsiniz -128 göstermesi gerekir

System.out.println(Byte.toString(digest[i])); 

..