打印从 bytearrayoutputstream 填充的字节数组
Printing byte array filled from bytearrayoutputstream
我已经使用 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]
请帮忙
150 等于 1001 0110
这是字节的位 -128(最左边的位)加上 2 + 4 + 16
= -106
你把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].
范围内
我已经使用 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]
请帮忙
150 等于 1001 0110 这是字节的位 -128(最左边的位)加上 2 + 4 + 16 = -106
你把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].
范围内