我试图转换一个无符号的有符号字节。问题是我接收的数据是无符号的,Java不支持无符号字节,所以当它读取数据时,它将其视为有符号的。

我尝试通过下面的解决方案转换它,我从Stack Overflow。

public static int unsignedToBytes(byte a)
{
    int b = a & 0xFF;
    return b;
}

但是当它再次以字节为单位转换时,我得到了相同的带符号数据。我试图使用此数据作为参数的Java函数,只接受一个字节作为参数,所以我不能使用任何其他数据类型。我该如何解决这个问题?


当前回答

在好奇netty ByteBuf writeInt和readUnsignedInt方法的明显不对称之后,我碰巧偶然地进入了这个页面。

在阅读了有趣和有教育意义的答案后,我仍然想知道你说的时候调用的是什么函数:

我试图使用这些数据作为参数的Java函数 只接受一个字节作为参数。

不管这么多年过去了,我的50美分如下:

让我们假设您正在调用的方法正在用微量更新一些余额,并且它根据一些定义良好的需求集进行操作。也就是说,它被认为对其预期的行为有正确的实现:

long processMicroPayment(byte amount) {
    this.balance += amount;
    return balance;     
}

Basically, if you supply a positive amount it will be added to the balance, and a negative amount will effectively be subtracted from the balance. Now because it accepts a byte as its parameter the implicit assumption is that it functionally only accepts amounts between -128 and +127. So if you want to use this method to add, say, 130 to the balance, it simply will not produce the result YOU desire, because there is no way within the implementation of this method to represent an amount higher than 127. So passing it 130 will not result in your desired behavior. Note that the method has no way of implementing a (say) AmountOutOfBoundsException because 130 will be 'interpreted' as a negative value that is still obeying the method's contract.

我有以下几个问题:

您是否根据其(隐式或显式)契约使用该方法? 方法是否正确实现? 我还是误解了你的问题吗?

其他回答

在Java中没有原始无符号字节。通常的做法是将其转换为更大的类型:

int anUnsignedByte = (int) aSignedByte & 0xff;

我不太明白你的问题。

我刚刚尝试了这一点,对于字节-12(有符号值),它返回整数244(相当于无符号字节值,但类型为int):

  public static int unsignedToBytes(byte b) {
    return b & 0xFF;
  }

  public static void main(String[] args) {
    System.out.println(unsignedToBytes((byte) -12));
  }

这是你想做的吗?

Java不允许像c那样将244表示为字节值。MAX_VALUE(127)你必须使用不同的整型,如short, int或long。

如果你认为你正在寻找这样的东西。

public static char toUnsigned(byte b) {
    return (char) (b >= 0 ? b : 256 + b);
}

由于Java中的限制,无符号字节在当前的数据类型格式中几乎是不可能的。你可以为你要实现的东西使用其他语言的其他库,然后你可以使用JNI调用它们。

虽然Java语言中没有包含无符号字节看起来很烦人(来自C),但这真的不是什么大问题,因为一个简单的“b & 0xFF”操作在(很少)实际需要的情况下为(有符号)字节b产生无符号值。比特实际上并没有改变——只是解释(这只在例如对值进行一些数学运算时很重要)。