2010-08-18 7 views
41

Der Compiler scheint mit diesem (einstelligen Hex-Werte nur) in Ordnung zu sein:Literal Syntax Für Byte [] Arrays mit Hex-Notation ..?

byte[] rawbytes={0xa, 0x2, 0xf}; 

Aber nicht dies:

byte[] rawbytes={0xa, 0x2, 0xff}; 

Ich erhalte einen „möglichen Verlust der Präzision gefunden: int erforderlich: byte " Error?

Was mache ich falsch - oder sind einzelne Ziffern Hexadezimalzahlen ein Sonderfall?

Java 1.5.x.

Antwort

41

Wie bereits erwähnt, Byte ist ein signierter Typ in Java. Der Bereich reicht von -128 bis einschließlich 127. Also ist 0xff gleich -0x01. Sie können 0xff statt -0x01 verwenden, wenn Sie eine manuelle insg:

byte[] rawbytes={0xa, 0x2, (byte) 0xff}; 
7

byte ist signiert und 0xff = 255 ist zu groß. Der gültige Bereich ist (-128 .. 127).

Beispielcode:

public static void main(String[] args) { 
    byte b = (byte) 0xff; // = -1 
    int i = b;    // = -1 
    int j = b & 0xff;  // = 255 

    System.out.printf("b=%s, i=%s, j=%s", b,i,j); 
} 
8

"0xff" ist ein int literal für den Dezimalwert 255, der als ein Byte nicht darstellbare ist.

Vorerst müssen Sie es auf einen byte werfen, den Compiler zu sagen, Sie wirklich -1 bedeuten, wie folgt aus:

byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF }; 

Es wurde vorgeschlagen, ein neues Byte Literalsyntax hinzufügen (y oder Y Suffix) zu Java 7. Dann würden Sie zu schreiben in der Lage sein:

byte[] rawbytes = { 0xA, 0x2, 0xFFy }; 

Allerdings wurde dieser Vorschlag nicht in dem „Omnibus Vorschlag für eine verbesserte integrale Literale“, so dass wir für immer mit den Darstellern geklebt werden.

+7

Der 'y' Suffix hat es nicht auf die Java-7-Release. Bitte entfernen Sie dieses Teil, damit es die Leser nicht verwirrt. – Natix

12

Es gibt eine weitere Möglichkeit, durch eine Hilfsfunktion mit variable Argumente deklarieren. Dies ist möglicherweise vorzuziehen, wenn Sie mehrere Byte-Arrays deklarieren müssen.

Beispielcode

public static byte[] toBytes(int... ints) { // helper function 
    byte[] result = new byte[ints.length]; 
    for (int i = 0; i < ints.length; i++) { 
     result[i] = (byte) ints[i]; 
    } 
    return result; 
} 

public static void main(String... args) { 

    byte[] rawbytes = toBytes(0xff, 0xfe); // using the helper 

    for (int i = 0; i < rawbytes.length; i++) { 
     System.out.println(rawbytes[i]); // show it works 
    } 
}