Android与Java服务器通信:为何打印同一byte数组得不同字符串?
解决Android中直接打印byte数组显示异常的问题
我完全懂你碰到的这个坑——当你直接把byte数组拼进字符串里传给Log.d()时,得到的不是预期的字节数值列表,反而像是[B@xxxxxxx这样的奇怪字符串,对吧?
问题根源
这是因为Java里数组的toString()方法是继承自Object类的默认实现,它并不会遍历数组元素输出内容,而是返回[类型标识@哈希码的格式([B就代表byte类型数组)。而Arrays.toString(byte[])是专门为数组设计的工具方法,它会逐个遍历字节元素,把每个值转换成字符串后拼接成列表形式,这才是你想要的结果。
正确的打印方式
把你的代码改成这样就可以正常输出字节数组的内容了:
import java.util.Arrays; // 先定义你的byte数组 byte[] testByteArray = new byte[]{109, 89, -47, 12, 80, -13, 27, -9, 1, 117, -128, -98, 31, 2, -79, -36, -38, 78, -88, 74, 78, 105, 8, -53, 63, -96, -126, 85, -63, -105, 96, 124}; // 使用Arrays.toString()来格式化输出 Log.d("byte array test", Arrays.toString(testByteArray));
额外小技巧
如果后续你需要以十六进制格式打印字节数组(这与服务器交互时很常见),可以自己实现一个简单的工具方法:
private String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X ", b)); } return sb.toString().trim(); } // 调用示例 Log.d("byte array hex", bytesToHex(testByteArray));
这样就能得到类似6D 59 D1 0C 50 F3 1B F7 01 75 80 9E 1F 02 B1 DC DE 4E A8 4A 4E 69 08 CB 3F A0 82 55 BD 97 60 7C的十六进制输出,更适合调试字节流。
内容的提问来源于stack exchange,提问作者Alex Jone
相关产品推荐
相关产品推荐

