打印从 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

你把int150写到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].

范围内