Java: syntax y significado detrás de “[B @ 1ef9157”? Binario / Dirección?

Oye, estoy tratando de descubrir qué significa el [prefijo B @ en java. Aparecen cuando bash imprimir matrices de bytes. Sin embargo, las matrices de bytes de tamaño 32 y tamaño 4 son idénticas en longitud. Siempre “[@ B1234567”.

¿Que es esto? Además, tienen la propiedad de solo imprimir valores hexadecimales. Sé que no puede tratarse simplemente de una impresión binaria porque aparecerán caracteres ascii aleatorios extendidos.

Aquí hay un ejemplo de una impresión de asignación de asignación de bytes byte [] a byte [], donde las asignaciones están separadas por dos puntos, y estas son matrices de bytes de claves de 4 bytes y elementos de 32 bytes.

[B@1ef9157:[B@1f82982 [B@181ed9e:[B@16d2633 [B@27e353:[B@e70e30 [B@cb6009:[B@154864a [B@18aaa1e:[B@3c9217 [B@20be79:[B@9b42e6 [B@16925b0:[B@14520eb [B@8ee016:[B@1742700 [B@1bfc93a:[B@acb158 [B@107ebe1:[B@1af33d6 [B@156b6b9:[B@17431b9 [B@139b78e:[B@16c79d7 [B@2e7820:[B@b33d0a [B@82701e:[B@16c9867 [B@1f14ceb:[B@89cc5e [B@da4b71:[B@c837cd [B@ab853b:[B@c79809 [B@765a16:[B@1ce784b [B@1319c:[B@3bc473 

Está viendo la identificación del objeto, no un volcado de los contenidos.

  • The [ means array.
  • B significa byte.
  • El @ separa el tipo de la ID.
  • Los dígitos hexadecimales son un ID de objeto o un código hash.

Si la intención es imprimir el contenido de la matriz, hay muchas maneras. Por ejemplo:

 byte[] in = new byte[] { 1, 2, 3, -1, -2, -3 }; System.out.println(byteArrayToString(in)); String byteArrayToString(byte[] in) { char out[] = new char[in.length * 2]; for (int i = 0; i < in.length; i++) { out[i * 2] = "0123456789ABCDEF".charAt((in[i] >> 4) & 15); out[i * 2 + 1] = "0123456789ABCDEF".charAt(in[i] & 15); } return new String(out); } 

Se puede encontrar una lista completa de la nomenclatura de tipo en la documentación de JNI .

Aquí está la lista completa:

  • B – byte
  • C – char
  • D – doble
  • F – flotador
  • I – int
  • J – largo
  • L *** clase totalmente calificada * ; ** – entre una L y una ; es el nombre completo de la clase, utilizando / como el delimitador entre paquetes (por ejemplo, Ljava/lang/String; )
  • S – corto
  • Z – booleano
  • [ – uno [ por cada dimensión del conjunto
  • (*** tipos de argumento * ) *** tipo de retorno * – firma de método, como (I)V , con el pseudo-tipo adicional de V para el método de vacío

[B @ significa “matriz de bytes”. Otros tipos de matrices primitivas tienen prefijos diferentes:

 class Test { public static void main(String [] args) { byte[] b = new byte[0]; int[] i = new int[0]; char[] c = new char[0]; long[] l = new long[0]; double[] d = new double[0]; float[] f = new float[0]; short[] s = new short[0]; System.out.println(b); System.out.println(i); System.out.println(c.toString()); System.out.println(l); System.out.println(d); System.out.println(f); System.out.println(s); } } 

Huellas dactilares:

 [B@3e25a5 [I@19821f [C@addbf1 [J@42e816 [D@9304b1 [F@190d11 [S@a90653 

Los tipos no primitivos incluyen el nombre del tipo después de [L por ejemplo:

 [Ljava.lang.String;@a90653 [Ljava.lang.Object;@de6ced 

Si desea imprimir el contenido de una matriz de bytes como hexadecimal, aquí hay un código para ayudarlo:

 class Test { public static void main(String [] args) { byte[] b = new byte[] { (byte) 0xf3, (byte) 0xf1, (byte) 0x7f }; System.out.println(toHex(b)); } private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray(); public static String toHex(byte[] bytes) { char[] c = new char[bytes.length*2]; int index = 0; for (byte b : bytes) { c[index++] = HEX_DIGITS[(b >> 4) & 0xf]; c[index++] = HEX_DIGITS[b & 0xf]; } return new String(c); } } 

La implementación predeterminada de toString() es el nombre de la clase, seguido de ‘@’, seguido del código hash del objeto (en hexadecimal).

El código hash predeterminado, a su vez, “se implementa típicamente al convertir la dirección interna del objeto en un número entero”. En la práctica, Sun JVM utiliza la dirección de un identificador de objeto como entrada para generar el código hash predeterminado.

En el caso de tipos primitivos ( int , char , etc.) o tipos de matriz como byte[] , se utilizan las reglas de denominación definidas en la Especificación de máquina virtual de Java para los descriptores de campo. De acuerdo con esas reglas, uno ‘[‘ indica una matriz de una dimensión, mientras que ‘B’ indica un tipo de byte componente.

Sospecho, aunque no sé, que las cadenas hexadecimales son representaciones de las direcciones de las instancias en la memoria, y probablemente tengan poco que ver con las longitudes de las matrices. ¿Puedes aclarar tu pregunta?

Vale la pena señalar que equals () proviene de Object, de modo que si a.equals (b) then a == bie si tiene dos arrays de bytes que contienen los mismos datos, no son iguales () y no coincidirán con las claves en un Hashtable, HashXxxx