23

Вопрос по syntax, binary, java, hex – Java: синтаксис и значение, стоящее за «[B @ 1ef9157»? Binary / адрес?

Привет,I'm trying to figure out what the [[email protected] prefix means in java.  Они выходят, когда я пытаюсь напечатать байтовые массивы. Однако байтовые массивы размером 32 и размером 4 идентичны по длине. Всегда & quot; [@ B1234567 & quot ;.

Что это? Кроме того, они имеют свойство только печатать шестнадцатеричные значения. Я знаю, что это не может быть просто двоичный отпечаток, потому что появятся случайные расширенные символы ascii.

Вот пример печати отображения хеш-таблицы byte [] to byte [], где отображения разделены двоеточием, и это байтовые массивы 4-байтовых ключей и 32-байтовых элементов.

[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]
[[email protected]:[[email protected]

Рассматривается ли использование Arrays.toString () или Arrays.deepToString () для отображения нормального значения?

от akarnokd
5 ответов
2

По умолчанию

toString() реализацией является имя класса, за которым следует «@», за которым следует хеш-код объекта (в шестнадцатеричном формате).

Хэш-код по умолчанию, в свою очередь, «обычно реализуется путем преобразования внутреннего адреса объекта в целое число». На практике Sun JVM использует адрес дескриптора объекта в качестве входных данных для генерации хэш-кода по умолчанию.

В случае примитивных типов (int, charи т. д.) или типы массивов, такие какbyte[]правила именования, определенные вСпецификация виртуальной машины Java для поля используются дескрипторы. Согласно этим правилам, один '[' ' указывает массив одного измерения, в то время как «B»; указывает тип компонентаbyte.

39

Вы просматриваете идентификатор объекта, а не дамп содержимого.

The [ means array. The B means byte. The @ separates the type from the ID. The hex digits are an object ID or hashcode.

Если целью является печать содержимого массива, есть много способов. Например:

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);
}

полный список типа номенклатуры можно найти вДокументация JNI.

Вот весь список:

B - byte C - char D - double F - float I - int J - long L***fully-qualified-class*;** - between an L and a ; is the full class name, using / as the delimiter between packages (for example, Ljava/lang/String;) S - short Z - boolean [ - one [ for every dimension of the array (***argument types*)***return-type* - method signature, such as (I)V, with the additional pseudo-type of V for void method

Метод hashCode () по умолчанию для объекта, однако, является "родным", что заставляет меня думать, что по умолчанию он имеет некоторый адрес памяти объекта :)

от 

Может кто-нибудь объяснить, что функцияbyteArrayToString делает?

от 

Шестнадцатеричные цифры - это не идентификатор объекта, а hashCode объекта (это можно рассматривать как идентификатор объекта yes)

от 
0

Стоит отметить

что equals () происходит от Object, поэтому, если a.equals (b), то a == b. то есть если у вас есть два байтовых массива, которые содержат одинаковые данные, они не равны () и не будут совпадать с ключами в Hashtable, HashXxxx

Это ничего не стоит?

от 

Оговорка по Фрейду ;)

от 
1

Я подозреваю

хотя я и не знаю, что шестнадцатеричные строки являются представлениями экземпляров ». адреса в памяти, и, вероятно, имеют мало общего с длинами массивов. Вы можете уточнить свой вопрос?

4

Другие типы примитивных массивов имеют разные префиксы:

[B @ означает «байтовый массив».

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);
    }
}

Печать:

[[email protected]
[[email protected]
[[email protected]
[[email protected]
[[email protected]
[[email protected]
[[email protected]

Непримитивные типы включают имя типа после[L например:

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

Если вы хотите напечатать содержимое байтового массива в шестнадцатеричном виде, вот вам некоторый код, который поможет вам:

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);
    }
}

На самом деле байтовый массив - это просто [B @ @e25a5 - метод toString () по умолчанию в Object (не переопределенный) return className () + & quot; @ & quot; + hasCode ()

от 

@JonSkeet Правда, правда.

от 

@ kd304: Но тогда вам нужно преобразовать байты в целые числа, проверить ошибки на единицу и т. д. Форматирование каждого байта с% 02X может быть более практичным (хотя и менее эффективным).

от 

Чувствуете ли вы хороший вопрос о сырых типах?stackoverflow.com/questions/1040540/…

от 

Вместо этого я бы проголосовал за String.format ("% 08X", intvalue).

от 

Похожие вопросы