2014-12-26 12 views
6

Nach einem Kommentar von OP: kann nicht mehrCasting int Byte gibt unterschiedliche Ergebnisse in Netbeans und JCreator

ich NetBeans reproduziert werden verwenden, um meine Java-Programme zu entwickeln, und sie funktionieren einwandfrei. Aber wenn ich eine JAR-Datei meines Programms mache, gibt es mir unterschiedliche Ausgabe für den gleichen Eingang.

hatte ich eine harte Zeit Debuggen und ich fand, dass in NetBeans, wenn ich int zu byte die Ergebnisbereiche in [-128; 128) gegossen, während der gleiche Code in JCreator in [0; 256)

ist Wie kann ich die Reichweite immer [-128; 128) machen ?

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

Sieht aus wie ein Fehler in JCreator (wir sprechen über [diese] (http://jcreator.com), rechts ?); es sieht so aus, als wenn man von "byte" nach "int" (in 'println()') uploadet, wird das Vorzeichenbit nicht wie erforderlich tragen, daher sind Ihre Ergebnisse – fge

+0

Nicht nur in (JCreator), sondern auch in einer normalen Windows-Umgebung. Wenn ich die (JAR) Datei in Windows ausführe, gab es mir dasselbe Ergebnis wie bei (JCreator). – 0FiRE0

+0

Und was ist dein JDK? Ist es Oracle? – fge

Antwort

2

Es sieht definitiv wie ein Fehler aus. Ein byte im Bereich von -128 bis 127, nicht 0 bis 255

Hier ist, was ich denke, ist mit einem Byte-Wert von -1 passiert (dh 0xFF), wo es 255 druckt statt:

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 
} 

Das heißt, wenn Sie von Byte zu int "upcasieren", tut der Java-Compiler, den Sie verwenden, nicht das, was die JLS von ihm verlangt, nämlich das Vorzeichen-Bit zu tragen.

Ich bezweifle ernsthaft, dass der Compiler/Läufer, den Sie verwenden, Oracle JDK auch aus diesem Grund an der Befehlszeile ist.

(beachten Sie, dass ein PrintStream hat a method to print an int, aber keine byte, daher wird das Byte in einen int gefördert wird)

+0

Die Ausgabe ist: -1 255. in beiden (NetBeans) und (JCreator). – 0FiRE0

+0

Nun, das ist normal, ich habe diesen Test gemacht; Schauen Sie sich die Kommentare über jedem von ihnen genau an – fge

1

, dass der Wert vom Byte erscheinen würde [] nicht richtig in der println umgewandelt wird (jedenfalls nicht, wie du es erwartest und die JLS hat es).

können Sie verwenden

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

die -128 angezeigt werden sollen .. 127

Verwandte Themen