【发布时间】:2010-09-05 21:09:17
【问题描述】:
在 Java 中,没有无符号字节这种东西。
处理一些低级代码时,有时您需要处理无符号值大于 128 的字节,这会导致 Java 将它们解释为负数,因为 MSB 用于符号。
有什么好的方法可以解决这个问题? (说不使用 Java 不是一种选择)
【问题讨论】:
在 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 将避免字节码中不必要的与 short 值的转换。
【讨论】:
byte 会更清晰,更好地传达代码的意图,所以我会使用它来提高可读性,甚至如果它使用与int 相同的空间。
byte 的库(想到 Android 上的 USB 堆栈),意识到 int 更适合您的预期目的将无济于事。
您最好的选择可能是使用整数而不是字节。它有空间允许大于 128 的数字,而无需创建特殊对象来替换字节的开销。
这也是比我聪明的人(每个人)提出的建议
【讨论】:
进行位操作/无符号字节的最佳方法是使用 ints。即使它们是有符号的,它们也有大量的备用位(总共 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 语句添加另一个条件即可。
【讨论】:
我想你可以只用一个短的来存储它们。效率不是很高,但除了我所见过的一些艰巨的努力之外,它确实是唯一的选择。
【讨论】: