【问题标题】:converting an array of signed bytes to unsigned bytes [duplicate]将有符号字节数组转换为无符号字节[重复]
【发布时间】:2025-12-14 11:40:01
【问题描述】:

我有一个字节数组。

bytes[] = [43, 0, 0, -13, 114, -75, -2, 2, 20, 0, 0]

我想将它转换为 Java 中的无符号字节。 这就是我所做的:创建一个新数组并使用 & 0xFF 复制值:

    this.bytes = new byte[bytes.length];
    for (int i=0;i<bytes.length;i++)
        this.bytes[i] = (byte) (bytes[i] & 0xFF);

但新数组中的值也保持负数。 我做错了什么?

【问题讨论】:

  • Java 中没有无符号字节。
  • 你希望像byteValue &amp; 0xFF 这样的操作会做什么?
  • @f1sh 它在将有符号字节转换为无符号 int 方面做得正确。如果您只是投射一个带有负值的字节,例如进入int,你最终会得到一个带有负数的int。所以这部分代码不是问题,只是将它放回(即再次转换)到 byte 的那部分代码最终得到了与您开始时相同的负值。

标签: java unsigned


【解决方案1】:

Java 中的bytes 始终是签名的。

如果要获取这些字节的无符号值,可以将它们存储在int数组中:

byte[] signed = {43, 0, 0, -13, 114, -75, -2, 2, 20, 0, 0};
int[] unsigned = new int[signed.length];
for (int i = 0; i < signed.length; i++) {
    unsigned[i] = signed[i] & 0xFF;
}

您将获得以下值:

[43, 0, 0, 243, 114, 181, 254, 2, 20, 0, 0]

【讨论】:

  • 我明白了。谢谢!在python中有,这就是为什么弄错了..
【解决方案2】:

Java 没有无符号字节。您必须使用其他类型,例如 shortint 才能保持大于 127 的值。

【讨论】:

    最近更新 更多