我有一个
String b = "[B@64964f8e";
这是我存储在字符串中的 byte[] 输出
现在我想将它转换回 byte[]
byte[] c = b.getBytes();
但它给了我不同的字节
[B@9615a1f
我怎样才能找回与 [B@64964f8e 相同的东西?
String b = "[B@64964f8e";
那不是一个真正的字符串。那是字节数组的类型和地址。它只不过是一个临时参考代码,如果原始数组是 GC'd,你甚至没有希望用真正时髦的本机方法在内存中嬉戏来取回它。
我怀疑您正在尝试做错事,这根本对您没有帮助,因为尽管您希望内容相同,而不是 toString() 方法的结果,但我还是会这样做。
您不应该将文本字符串用于二进制数据,但您可以使用ISO-8859-1
byte[] bytes = random bytes
String text = new String(bytes, "ISO-8859-1");
byte[] bytes2 = text.getBytes("ISO-8859-1"); // gets back the same bytes.
但是要回答您的问题,您可以这样做。
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
byte[] bytes = new byte[0];
unsafe.putInt(bytes, 1L, 0x64964f8e);
System.out.println(bytes);
印刷
[B@64964f8e
"[B@64964f8e"
不是您的byte[]
. 这是默认toString()
实现的结果,它告诉您类型和引用位置。也许您想改用 base64 编码,例如使用javax.xml.bind.DatatypeConverter
's parseBase64Binary()
和printBase64Binary()
:
byte[] myByteArray = // something
String myString = javax.xml.bind.DatatypeConverter.printBase64Binary(myByteArray);
byte[] decoded = javax.xml.bind.DatatypeConverter.parseBase64Binary(myString);
// myByteArray and decoded have the same contents!
一个简单的答案是:
System.out.println(c)
打印 c 对象的引用表示。不是c的内容。(仅在 Object 的toString()
方法未被覆盖的情况下)
String b = "[B@64964f8e";
byte[] c = b.getBytes();
System.out.println(c); //prints reference's representation of c
System.out.println(new String(c)); //prints [B@64964f8e