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
Foi útil?

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 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 de V 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top