Java:“[B@1ef9157”背后的语法和含义?二进制/地址?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1040868/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 14:54:12  来源:igfitidea点击:

Java: Syntax and meaning behind "[B@1ef9157"? Binary/Address?

javasyntaxbinaryhex

提问by montooner

Hey, I'm trying to figure out what the [B@ prefix means in java.They come out when I attempt to print byte arrays. However, byte arrays of size 32 and size 4 are identical in length. Always "[@B1234567".

嘿,我想弄清楚 [B@ 前缀在 java 中的含义。当我尝试打印字节数组时,它们会出现。但是,大小为 32 和大小为 4 的字节数组在长度上是相同的。总是“[@B1234567”。

What is this? Also, they have the property of only printing hex values. I know it can't just be a binary print because random extended ascii chars would appear.

这是什么?此外,它们具有仅打印十六进制值的属性。我知道它不能只是二进制打印,因为会出现随机扩展的 ascii 字符。

Here is an example of a byte[] to byte[] hashtable mapping print, where mappings are separated by a colon, and these are byte arrays of 4-byte keys and 32-byte elements.

这是 byte[] 到 byte[] 哈希表映射打印的示例,其中映射由冒号分隔,这些是 4 字节键和 32 字节元素的字节数组。

[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

回答by lavinio

You're looking at the object ID, not a dump of the contents.

您正在查看对象 ID,而不是内容的转储。

  • The [means array.
  • The Bmeans byte.
  • The @separates the type from the ID.
  • The hex digitsare an object ID or hashcode.
  • [装置阵列。
  • 所述手段字节。
  • @分离从ID的类型。
  • 十六进制数字是对象ID或哈希码。

If the intent is to print the contents of the array, there are many ways. For example:

如果目的是打印数组的内容,有很多方法。例如:

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 complete listof the type nomenclature can be found in the JNI documentation.

一个完整的列表类型命名的可以在中找到JNI文档

Here is the entire list:

这是整个列表:

  • B- byte
  • C- char
  • D- double
  • F- float
  • I- int
  • J- long
  • L***fully-qualified-class*;** - between an Land 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 Vfor void method
  • B- 字节
  • C- 字符
  • D-
  • F- 浮动
  • - 整数
  • J——
  • L***fully-qualified-class*;** - anL和 a之间;是完整的类名,/用作包之间的分隔符(例如,Ljava/lang/String;
  • S- 短
  • Z- 布尔值
  • [-[数组的每个维度一个
  • (***argument types*)***return-type* - 方法签名,例如(I)V,带有Vfor void 方法的附加伪类型

回答by Jon Skeet

[B@ means "byte array". Other primitive array types have different prefixes:

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

Prints:

印刷:

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

Non-primitive types include the type name after [Lfor instance:

非原始类型包括[L例如后面的类型名称:

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

If you want to print the contents of a byte array as hex, here's some code to help you:

如果要将字节数组的内容打印为十六进制,这里有一些代码可以帮助您:

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

回答by erickson

The default toString()implementation is the class name, followed by '@', followed by the object's hash code (in hexadecimal).

默认toString()实现是类名,后跟“@”,后跟对象的哈希码(十六进制)。

The default hash code, in turn, is "typically implemented by converting the internal address of the object into an integer". In practice, the Sun JVM uses the address of an object handle as input to generate the default hash code.

反过来,默认哈希码“通常通过将对象的内部地址转换为整数来实现”。实际上,Sun JVM 使用对象句柄的地址作为输入来生成默认哈希码。

In the case of primitive types (int, char, etc.) or array types like byte[], naming rules defined in the Java Virtual Machine Specificationfor field descriptors are used. According to those rules, one '[' indicates an array of one dimension, while 'B' indicates a component type of byte.

在原始类型(intchar等)或数组类型(如 )的情况下,byte[]将使用Java 虚拟机规范中定义的字段描述符命名规则。根据这些规则,一个 '[' 表示一个一维数组,而 'B' 表示一个组件类型byte

回答by Tim Gilbert

I suspect, though I don't know, that the hex strings are representations of the instances' addresses in memory, and probably have little to do with the lengths of the arrays. Can you clarify your question?

我怀疑,虽然我不知道,十六进制字符串是内存中实例地址的表示,可能与数组的长度几乎没有关系。你能澄清你的问题吗?

回答by Peter Lawrey

It worth noting that equals() comes from Object, so that if a.equals(b) then a == b. i.e. if you have two byte arrays which contain the same data, they are not equals() and will not match keys in a Hashtable, HashXxxx

值得注意的是,equals() 来自 Object,因此如果 a.equals(b) then a == bie 如果您有两个包含相同数据的字节数组,则它们不是 equals() 并且不会匹配 a哈希表,HashXxxx

回答by Pedro Henrique

I had this problem when I used csv input component. After a lot of hours I discovered that the values are bytes. I resolved this selecting Yes for the parameter Binary to normal on Select Value component.

我在使用 csv 输入组件时遇到了这个问题。很多小时后,我发现这些值是字节。我解决了在 Select Value 组件上为参数 Binary 选择 Yes 的问题。