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

2022-09-01 16:57:03

嘿,我试图弄清楚java中的[B@前缀是什么意思。当我尝试打印字节数组时,它们就会出来。但是,大小为 32 和大小为 4 的字节数组在长度上是相同的。始终为“[@B1234567”。

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

下面是一个字节[]到字节[]哈希表映射打印的示例,其中映射由冒号分隔,这些是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

答案 1

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

  • [ 表示数组。
  • B 表示字节。
  • @ 将类型与 ID 分开。
  • 六进制数字是对象 ID 或哈希码。

如果目的是打印阵列的内容,则有很多方法。例如:

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 - 字节
  • C - 字符
  • D - 双
  • F - 浮子
  • I - 整型
  • J - 长
  • L***完全限定类*;** - 在 a 和 a 之间是完整的类名,用作包之间的分隔符(例如,L;/Ljava/lang/String;)
  • S - 短
  • Z - 布尔值
  • [- 数组的每个维度一个[
  • (***参数类型*)***返回类型* - 方法签名,例如 ,带有 for void 方法的附加伪类型(I)VV

答案 2

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

指纹:

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

非基元类型包括以下类型的类型名称:例如:[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);
    }
}