解决所有 Java 字节都已签名这一事实的最佳方法是什么?
题
在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 语句中添加另一个条件即可解决问题。
我想你可以用一个短路来存储它们。效率不是很高,但确实是除了我所见过的一些巨大努力之外的唯一选择。