在 Java 中,没有无符号字节之类的东西。
处理一些低级代码时,有时您需要处理无符号值大于 128 的字节,这会导致 Java 将它们解释为负数,因为 MSB 用于符号。
解决这个问题的好方法是什么?(说不使用 Java 不是一种选择)
如果您这样做,实际上可以摆脱 if 语句和添加。
byte[] foobar = ..;
int value = (foobar[10] & 0xff);
这样,Java 就不会将字节解释为负数,也不会翻转整数上的符号位。
从数组中读取任何单个值时,将其复制为 short 或 int 之类的内容,然后手动将负数转换为应有的正值。
byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
您可以在写入数组时进行类似的转换。
使用 int 通常比使用 short 更好,因为 java 在内部无论如何都使用 32 位值(即使是字节,除非在数组中),因此使用 int 将避免不必要地转换到字节码中的短值/从短值转换。
可能您最好的选择是使用整数而不是字节。它有空间允许大于 128 的数字,而无需创建特殊对象来替换字节的开销。
这也是比我聪明的人建议的(每个人)
进行位操作/无符号字节的最佳方法是使用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原语。
我知道这是一个很晚的回应,但我在尝试做同样的事情时遇到了这个线程。问题只是试图确定 Java 字节是否 >127。
简单的解决方案是:
if((val & (byte)0x80) != 0) { ... }
如果真正的问题是 >128,那么只需在该 if 语句中添加另一个条件即可。
我想你可以用一个短的来存储它们。效率不是很高,但除了我所见过的一些艰巨的努力之外,它确实是唯一的选择。