2010-08-18 13 views
41

El compilador parece estar bien con esto (valores hexadecimales de un solo dígito solamente):Sintaxis literal Para matrices de bytes [] que usan notación hexadecimal ...?

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

Pero no esto:

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

consigo una "posible pérdida de precisión encontró: int requerido: Byte "error?

¿Qué estoy haciendo mal - o son números hexadecimales de un solo dígito un caso especial?

Java 1.5.x.

Respuesta

41

Como la otra respuesta ya mencionada, el byte es un tipo firmado en Java. El rango es de -128 a 127 inclusive. Entonces 0xff es igual a -0x01. Se puede utilizar en lugar de 0xff -0x01 si se agrega un elenco Manual:

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

byte está firmado y 0xff = 255 es demasiado grande. El rango válido es (-128 .. 127).

código Ejemplo:

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" es un int literal para el valor decimal 255, que no es representable como un byte.

Por ahora, tendrá que convertirlo a byte para decirle al compilador que realmente significa -1, así:

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

Se propone añadir una nueva sintaxis literal de bytes (o yY sufijo) a Java 7. Entonces habría podido escribir:

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

sin embargo, esta propuesta no se incluyó en la "propuesta ómnibus para la mejora de los literales integrales", por lo que atascados con el elenco para siempre.

+7

El sufijo 'y' no ha llegado a la versión de Java 7. Quita esa parte para que no confunda a los lectores. – Natix

12

Existe una posibilidad más al declarar una función auxiliar con argumentos variables. Esto puede ser preferible si necesita declarar matrices de bytes múltiples.

código Ejemplo

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 
    } 
} 
Cuestiones relacionadas