什么是解决所有Java字节被签名的最好方法?
在Java中,没有无符号字节的东西。
使用一些低级代码时,偶尔需要使用无符号值大于128的字节,这会导致Java将它们解释为负数,这是由于MSB用于符号。
什么是解决这个问题的好方法? (说不要使用Java不是一种select)
当从数组中读取任何单个值时,将其复制到short或inttypes中,然后手动将负数转换为正值。
byte[] foobar = ..; int value = foobar[10]; if (value < 0) value += 256 // Patch up the 'falsely' negative value
写入数组时,可以执行类似的转换。
@pauldoo
如果你这样做,它实际上可以摆脱if语句和添加。
byte[] foobar = ..; int value = (foobar[10] & 0xff);
这样Java不会将字节解释为负数,也可以翻转整数的符号位。
使用int通常比使用shorts更好,因为java在内部使用32位值(即使对于字节,除非在数组中),所以使用ints将避免不必要的字节码中的短值转换。
也许你最好的select是使用整数而不是字节。 它有足够的空间允许大于128的数字,而不必创build一个特殊的对象来代替字节。
这也是比我更聪明的人(每个人)
执行位操作/无符号字节的最好方法是使用int s。 即使它们被签名,它们也有足够的空闲位(总共32位)作为无符号字节处理。 而且,所有的math运算符都会将较小的固定精度数字转换为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原始typeshttp://mindprod.com/jgloss/primitive.html的更多信息
最后一个小问题是,Java中有一个无符号的固定精度数字。 这是char原始。
我知道这是一个非常晚的反应,但是当我尝试做同样的事情时遇到了这个线索。 这个问题只是试图确定一个Java字节是否> 127。
简单的解决scheme是:
if((val & (byte)0x80) != 0) { ... }
如果真正的问题是> 128,而只是添加另一个条件,该if语句将做的伎俩。
我想你可以用一小段来存储它们。 不是很有效率,但是除了我所看到的一些艰巨的努力之外,它真的是唯一的select。