59

在 Java 中,没有无符号字节之类的东西。

处理一些低级代码时,有时您需要处理无符号值大于 128 的字节,这会导致 Java 将它们解释为负数,因为 MSB 用于符号。

解决这个问题的好方法是什么?(说不使用 Java 不是一种选择)

4

7 回答 7

82

如果您这样做,实际上可以摆脱 if 语句和添加。

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

这样,Java 就不会将字节解释为负数,也不会翻转整数上的符号位。

于 2008-08-21T01:17:45.400 回答
20

从数组中读取任何单个值时,将其复制为 short 或 int 之类的内容,然后手动将负数转换为应有的正值。

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

您可以在写入数组时进行类似的转换。

于 2008-08-14T14:24:50.453 回答
1

使用 int 通常比使用 short 更好,因为 java 在内部无论如何都使用 32 位值(即使是字节,除非在数组中),因此使用 int 将避免不必要地转换到字节码中的短值/从短值转换。

于 2008-08-19T08:03:27.637 回答
0

可能您最好的选择是使用整数而不是字节。它有空间允许大于 128 的数字,而无需创建特殊对象来替换字节的开销。

这也是比我聪明的人建议的(每个人)

于 2008-08-14T14:22:24.997 回答
0

进行位操作/无符号字节的最佳方法是使用int s。即使它们是有符号的,它们也有大量的备用位(总共 32 个)可以视为无符号字节。此外,所有数学运算符都会将较小的固定精度数转换为int。例子:

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

因此,最好只使用整数并对其进行屏蔽以获取您感兴趣的位。示例:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

这是有关 Java 原始类型的更多信息http://mindprod.com/jgloss/primitive.html

最后一点,Java 中有一个无符号的固定精度数。那是char原语。

于 2008-08-19T03:39:43.473 回答
0

我知道这是一个很晚的回应,但我在尝试做同样的事情时遇到了这个线程。问题只是试图确定 Java 字节是否 >127。

简单的解决方案是:

if((val & (byte)0x80) != 0) { ... }

如果真正的问题是 >128,那么只需在该 if 语句中添加另一个条件即可。

于 2011-02-18T23:33:42.293 回答
-1

我想你可以用一个短的来存储它们。效率不是很高,但除了我所见过的一些艰巨的努力之外,它确实是唯一的选择。

于 2008-08-14T14:17:48.847 回答