2011-08-09 27 views
6

Tengo un pequeño error en mi código que no puedo entender.Java Byte.parseByte() error

tengo una matriz de cadenas que son representaciones de datos binarios (después de la conversión de ellos a partir de hex) por ejemplo: un índice es 1011 y otro es 11100. voy a través de la matriz y de la almohadilla de cada índice con 0 de manera que cada el índice es de ocho bytes. Cuando intento de convertir estas representaciones en bytes reales que recibo un error cuando trato de analizar '11111111' El error que consigo es:

java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2 

Aquí hay un fragmento:

String source = a.get("image block"); 
int val; 
byte imageData[] = new byte[source.length()/2]; 

try { 
    f.createNewFile(); 
    FileOutputStream output = new FileOutputStream(f); 
    for (int i=0; i<source.length(); i+=2) { 
     val = Integer.parseInt(source.substring(i, i+2), 16); 
     String temp = Integer.toBinaryString(val); 
     while (temp.length() != 8) { 
      temp = "0" + temp; 
     } 
    imageData[i/2] = Byte.parseByte(temp, 2); 
} 
+2

'byte''s solo permiten números en el rango de -128 a 127. Yo usaría un' int' en su lugar, que tiene números en el rango de -2.1 mil millones a 2.1 mil millones. – fireshadow52

Respuesta

19

No es el problema aquí es que byte es un tipo firmado, por lo tanto, sus valores válidos son -128 ... 127? Si lo analiza como int (usando Integer.parseInt()), debería funcionar.

Por cierto, tampoco tiene que rellenar el número con ceros.

Una vez que Analizada la cadena binaria en un int, puede convertirlo a un byte, pero el valor será todavía ser tratados como firmado, por lo que se convertirá en binary 11111111int 255 primero, y luego byte -1 después de la fundición.

+0

Su edición es correcta. – fireshadow52

1

Bueno, ocho uno de es de 255, y de acuerdo con java.lang.Byte, la MAX_VALUE es 2^7 - 1 o positivo 127.

lo que el código fallará debido a que el número es demasiado grande. El primer bit está reservado para el signo positivo y negativo.

según parseByte

1

byte 's sólo permiten números en el rango de -128 a 127. Me gustaría utilizar un int lugar, que sostiene números en el rango de -2.1 mil millones a 2100 millones.