在Java中,不存在无符号字节这样的东西。

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

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

有帮助吗?

解决方案

当从数组中读取任何单个值时,将其复制为一个短整型或一个整数,并手动将负数转换为应有的正值。

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

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

其他提示

如果你这样做的话,实际上是可以去掉 if 语句和添加的。

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

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

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

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

这也是比我聪明的人(大家)建议的

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

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 中有一个无符号固定精度数。那就是 字符 原始。

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

简单的解决方案是:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top