0

我有一个

String b = "[B@64964f8e";

这是我存储在字符串中的 byte[] 输出

现在我想将它转换回 byte[]

byte[] c = b.getBytes();

但它给了我不同的字节

[B@9615a1f

我怎样才能找回与 [B@64964f8e 相同的东西?

4

4 回答 4

1
String b = "[B@64964f8e";

那不是一个真正的字符串。那是字节数组的类型和地址。它只不过是一个临时参考代码,如果原始数组是 GC'd,你甚至没有希望用真正时髦的本机方法在内存中嬉戏来取回它。

于 2013-09-05T15:52:14.890 回答
1

我怀疑您正在尝试做错事,这根本对您没有帮助,因为尽管您希望内容相同,而不是 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
于 2013-09-05T15:52:20.140 回答
1

"[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!
于 2013-09-05T16:04:04.813 回答
0

一个简单的答案是:

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
于 2013-09-05T15:59:45.127 回答