Java: Sintaxe e significado por trás “[B @ 1ef9157”? Binary / Endereço?
Pergunta
Ei, Eu estou tentando descobrir o que o [B @ meios de prefixo em Java. Eles saem quando tento imprimir matrizes de bytes. No entanto, matrizes de bytes de tamanho 32 e tamanho 4 são idênticas em comprimento. Sempre "[@ B1234567".
O que é isso? Além disso, eles têm a propriedade de apenas imprimir valores hexadecimais. Eu sei que não pode ser apenas uma cópia binária porque aleatórios caracteres ASCII estendidos iria aparecer.
Aqui é um exemplo de um byte [] a byte [] impressão mapeamento tabela de dispersão, onde mapeamentos são separados por dois pontos, e estes são matrizes de bytes de chaves de 4 bytes e 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
Solução
Você está olhando para a identificação do objeto, não um despejo dos conteúdos.
- O
[ matriz meios. - O
B meios de byte. - O @ separa o tipo da ID.
- O hex dígitos é um número de referência ou código hash.
Se a intenção é imprimir o conteúdo da matriz, há muitas maneiras. Por exemplo:
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);
}
A lista completa ??a > do tipo nomenclatura pode ser encontrada no documentação JNI .
Aqui está a lista completa:
- B - byte
- C - caractere
- D - double
- F - flutuador
- I - int
- J - longo
- L *** de classe totalmente qualificado * ; ** - entre um
L
e uma;
é o nome completo da classe, usando/
como delimitador entre pacotes (por exemplo,Ljava/lang/String;
) - S - curto
- Z - boolean
- [ - um
[
para cada dimensão da matriz - (*** tipos dos argumentos * ) *** retorno do tipo * - assinatura do método, como
(I)V
, com o pseudo-tipo adicional deV
para o método vazio
Outras dicas
[B @ significa "matriz de bytes". Outros tipos de matrizes primitivas têm diferentes prefixos:
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);
}
}
Prints:
[B@3e25a5
[I@19821f
[C@addbf1
[J@42e816
[D@9304b1
[F@190d11
[S@a90653
tipos não-primitivos incluem o nome do tipo após [L
por exemplo:
[Ljava.lang.String;@a90653
[Ljava.lang.Object;@de6ced
Se você quiser imprimir o conteúdo de uma matriz de bytes como hex, aqui está algum código para ajudá-lo:
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);
}
}
A implementação toString()
padrão é o nome da classe, seguido de '@', seguido pelo código de hash do objeto (em hexadecimal).
O código hash padrão, por sua vez, é "tipicamente implementado pela conversão do endereço interno do objeto em um inteiro". Na prática, a Sun JVM usa o endereço de um identificador de objeto como entrada para gerar o código de hash padrão.
No caso de tipos de primitivas (int
, char
, etc.) ou tipos de matriz, como byte[]
, as regras de nomenclatura definida no Java Virtual Machine Specification para descritores de campo são usados. De acordo com essas regras, um '[' indica uma matriz de uma dimensão, enquanto que 'B' indica um tipo de componente de byte
.
Eu suspeito que, embora eu não sei, que as cordas hexadecimais são representações de endereços dos casos em memória, e provavelmente tem pouco a ver com os comprimentos das matrizes. Você pode esclarecer sua pergunta?
É importante notar que equals () vem do objeto, de modo que se a.Equals (b) Em seguida a == b. ou seja, se você tem duas matrizes de bytes que contêm os mesmos dados, eles não são iguais () e não irá corresponder chaves em um Hashtable, HashXxxx