bytes - byte[] java ejemplo
Cómo convertir cadenas binarias a la matriz de bytes de 2 bytes en Java (4)
Tengo una cadena binaria String A = "1000000110101110"
. Quiero convertir esta cadena en matriz de bytes de longitud 2 en java
He tomado la ayuda de este enlace
He intentado convertirlo en byte de varias maneras
He convertido esa cadena en decimal primero y luego aplico el código para almacenar en la matriz de bytes
int aInt = Integer.parseInt(A, 2); byte[] xByte = new byte[2]; xByte[0] = (byte) ((aInt >> 8) & 0XFF); xByte[1] = (byte) (aInt & 0XFF); System.arraycopy(xByte, 0, record, 0, xByte.length);
Pero los valores almacenados en la matriz de bytes son negativos
xByte[0] :-127
xByte[1] :-82
¿Cuáles son los valores equivocados?
2. También he intentado usar
byte[] xByte = ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putInt(aInt).array();
Pero arroja la excepción en la línea de arriba como
java.nio.Buffer.nextPutIndex(Buffer.java:519) at
java.nio.HeapByteBuffer.putInt(HeapByteBuffer.java:366) at
org.com.app.convert.generateTemplate(convert.java:266)
¿Qué debo hacer ahora para convertir la cadena binaria en una matriz de bytes de 2 bytes? ¿Hay alguna función incorporada en java
para obtener la matriz de bytes?
La respuesta que estás recibiendo
xByte[0] :-127
xByte[1] :-82
es correcto.
Esto se llama represantación del cumplido de 2. El primer bit se usa como bit con signo.
0 for +ve
1 for -ve
si el 1er bit es 0 de lo que calcula como regular. pero si el 1er bit es 1 que deduce los valores de 7 bits de 128 y cualquiera que sea la respuesta se presenta en forma de -ve.
En su caso, el primer valor es 10000001
por lo que 1 (1er bit) para -ve y 128-1 (los últimos siete bits) = 127, por lo tanto, el valor es -127.
Para más detalles, lea la representación del complemento de 2.
Los bytes están firmados con enteros de 8 bits. Como tal, su resultado es completamente correcto. Es decir: 01111111 es 127, pero 10000000 es -128. Si desea obtener números en el rango 0-255, debe usar un tipo de variable más grande, como el corto.
Puede imprimir el byte como unsigned como este:
public static String toString(byte b) {
return String.valueOf(((short)b) & 0xFF);
}
Use putShort
para poner un valor de dos bytes. int
tiene cuatro bytes.
// big endian is the default order
byte[] xByte = ByteBuffer.allocate(2).putShort((short)aInt).array();
Por cierto, tu primer intento es perfecto . No puede cambiar el signo negativo de los bytes ya que se establece el bit más significativo de estos bytes. Eso siempre se interpreta como valor negativo.
10000001₂ == -127
10101110₂ == -82
prueba esto
String s = "1000000110101110";
int i = Integer.parseInt(s, 2);
byte[] a = {(byte) ( i >> 8), (byte) i};
System.out.println(Arrays.toString(a));
System.out.print(Integer.toBinaryString(0xFF & a[0]) + " " + Integer.toBinaryString(0xFF & a[1]));
salida
[-127, -82]
10000001 10101110
eso es -127 == 0xb10000001 y -82 == 0xb10101110