【问题标题】: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] 范围内。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-19
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多