【问题标题】:Printing byte array filled from bytearrayoutputstream打印从 bytearrayoutputstream 填充的字节数组
【发布时间】:2017-11-25 19:28:10
【问题描述】:
我已经使用 ByteArrayOutputStream 填充了一个字节数组。当我打印它时,输出令人困惑。我需要一些指导。
这是我的代码:
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(bout);
try {
out.writeInt(150);
byte[] b = bout.toByteArray();
System.out.println(Arrays.toString(b));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这是我的输出:
[0, 0, 0, -106]
请帮忙
【问题讨论】:
标签:
java
arrays
bytearrayoutputstream
【解决方案1】:
150 等于 1001 0110
这是字节的位 -128(最左边的位)加上 2 + 4 + 16
= -106
【解决方案2】:
您将int 150 写入out。在二进制中(特别是two's complement),这个整数看起来像这样:
0000 0000 0000 0000 0000 0000 1001 0110
每组 8 位是一个数据字节,类似于 byte 数据类型。但是,与 Java 的所有整数类型(char 除外)一样,byte 是有符号的。因此,即使最后一个byte 的二进制值是1001 0110,它也会显示为-106,这是二进制补码中该字节的正确值。您可以将您的打印语句替换为:
String[] strings = new String[b.length];
for (int i = 0; i < b.length; i++) {
strings[i] = Integer.toString(Byte.toUnsignedInt(b[i]));
}
System.out.println("[" + String.join(", ", strings) + "]");
它将以无符号格式打印字节;每个都将位于 [0, 255] 范围内。