【问题标题】:unsigned bytes in Java byte arrayJava字节数组中的无符号字节
【发布时间】:2017-12-03 15:41:26
【问题描述】:

这似乎是一个简单的问题,但我很困惑。

byte[] bArray = new byte[]{(byte) (0x80 & 0xff)};
System.out.println(bArray[0]);

我的输出是-128。为什么? 如何重写它以使字节数组包含 128? 我认为0xff 使它未签名。 感谢您的帮助!

【问题讨论】:

  • 你把结果放到一个字节中。所有 Java 字节都已签名。从字节数组中读取后,您可以将其转换为 int。

标签: java arrays byte unsigned


【解决方案1】:

我以为 0xff 使它无符号。

嗯,它确实,有点 - 它将它提升为 int,并且只保留最后 8 位。

但是,您随后会将其结果转换回 byte,并且 Java 中的 byte总是 已签名。 (这很烦人,但它就是这样。)所以你还不如写:

byte[] bArray = { (byte) 0x80 };

结果会完全一样。

您正在存储要存储的位模式 (10000000),因此如果您将其传输到其他地方,则无需担心...只是当您将其视为 byte 时Java 很烦人。

【讨论】:

【解决方案2】:

根据Java Language Specification 4.2.1的字节取值范围

对于字节,从 -128 到 127,包括

所以没有办法(在Java中)一个字节将保持(字节)128。

您可以将字节转换为 int 并应用 & 0xff 以获取字节的无符号表示(作为 int)。但是如果你将它转换回一个字节,它将再次被解释为 -128 和 127 之间的有符号值......

如果您只关心打印:

System.out.println(bArray[0] & 0xff);

或者,十六进制

System.out.printf("0x%02x\n", bArray[0]);

【讨论】:

    【解决方案3】:

    我的答案附在大图

    【讨论】:

    • 你可以看到最大值。 value 是 127,所以如果你想要 128,你需要升级到 short 类型而不是 byte 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多