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

问题描述 投票:25回答:6

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

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

[这里是从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
java syntax binary hex
6个回答
43
投票

您正在查看对象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); } complete list中找到命名类型的[A JNI documentation

这是整个列表:

B

-字节
  • C
  • -字符
  • D
  • -双重
  • F
  • -浮点
  • I
  • -int
  • J
  • -长
  • L ***完全合格的类*
  • ; **-L;之间是完整的类名,使用/作为包之间的分隔符(例如,[ C0])
  • S
  • -短
  • Z
  • -布尔值
  • [[
  • -数组的每个维数一个Ljava/lang/String;
  • ((***参数类型*
  • )***返回类型*-方法签名,例如[,以及用于无效方法的附加伪类型(I)V

4
投票
打印:

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


2
投票
[对于基本类型(toString()int等)或数组类型(例如char),使用在byte[]中为字段描述符定义的命名规则。根据这些规则,“ [”表示一维数组,而“ B”表示Java Virtual Machine Specification的组件类型。

我怀疑,尽管我不知道,十六进制字符串是实例在内存中的地址的表示形式,可能与数组的长度无关。您能澄清您的问题吗?


1
投票

值得注意的是equals()来自Object,因此,如果a.equals(b)则a == b。也就是说,如果您有两个包含相同数据的字节数组,则它们不是equals(),并且不会与Hashtable中的键匹配,HashXxxx


0
投票

我使用csv输入组件时遇到了这个问题。几个小时后,我发现这些值是字节。我解决了此问题,在“选择值”组件上为参数Binary to normal选择了“是”。

© www.soinside.com 2019 - 2024. All rights reserved.