什么是解决所有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。