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

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

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

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


当前回答

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

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

其他回答

Adamski提供了最好的答案,但它并不完整,所以阅读他的回复,因为它解释了我没有的细节。

如果你有一个系统函数需要传递一个无符号字节给它,你可以传递一个有符号字节,因为它会自动把它当作一个无符号字节。

因此,如果一个系统函数需要四个字节,例如,192 168 0 1作为无符号字节,您可以传递-64 -88 0 1,并且函数仍然可以工作,因为将它们传递给函数的行为将取消它们的符号。

然而,您不太可能遇到这个问题,因为系统函数隐藏在类后面以实现跨平台兼容性,尽管一些java。IO read方法返回一个int类型的未叹号字节。

如果您希望看到这种工作,请尝试将有符号字节写入文件,并将它们作为无符号字节读取回来。

是也不是。我一直在研究这个问题。 就像我明白这个

事实上,java已经对整数-128到127进行了签名。 在java中可以通过以下方式来表示unsigned对象:

public static int toUnsignedInt(byte x) {
    return ((int) x) & 0xff;
}

如果你把-12有符号数加为无符号数,就得到244。但是你可以再次使用这个数字,它必须被移回符号,它还是-12。

如果你尝试添加244到java字节,你会得到outOfIndexException。

欢呼声……

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

这与函数接受一个大于2^32-1的整数并没有本质上的区别。

这听起来似乎取决于函数是如何定义和记录的;我认为有三种可能:

It may explicitly document that the function treats the byte as an unsigned value, in which case the function probably should do what you expect but would seem to be implemented wrong. For the integer case, the function would probably declare the parameter as an unsigned integer, but that is not possible for the byte case. It may document that the value for this argument must be greater than (or perhaps equal to) zero, in which case you are misusing the function (passing an out-of-range parameter), expecting it to do more than it was designed to do. With some level of debugging support you might expect the function to throw an exception or fail an assertion. The documentation may say nothing, in which case a negative parameter is, well, a negative parameter and whether that has any meaning depends on what the function does. If this is meaningless then perhaps the function should really be defined/documented as (2). If this is meaningful in an nonobvious manner (e.g. non-negative values are used to index into an array, and negative values are used to index back from the end of the array so -1 means the last element) the documentation should say what it means and I would expect that it isn't what you want it to do anyway.

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

如果您想在Java中使用无符号字节,只需从感兴趣的数字中减去256。它将生成带有负值的2的补数,这是所需的无符号字节数。

例子:

int speed = 255; //Integer with the desired byte value
byte speed_unsigned = (byte)(speed-256);
//This will be represented in two's complement so its binary value will be 1111 1111
//which is the unsigned byte we desire.

在使用leJOS编程NXT块时,您需要使用这种肮脏的技巧。