解决所有Java字节都经过签名这一事实的最佳方法是什么?

解决所有Java字节都经过签名这一事实的最佳方法是什么?,java,byte,unsigned,signed,Java,Byte,Unsigned,Signed,在Java中,没有无符号字节 处理一些低级代码时,有时需要处理无符号值大于128的字节,这会导致Java将它们解释为负数,因为MSB用于符号 解决这个问题的好方法是什么?(说不要使用Java不是一个选项)我想你可以用一个简短的语句来存储它们。效率不是很高,但实际上除了我所看到的一些巨大的努力之外,这是唯一的选择。也许你最好的选择是使用整数而不是字节。它有空间允许大于128的数字,而无需创建特殊对象来替换字节 这也是比我聪明的人(每个人)的建议 从数组中读取任何单个值时,将其复制为short

在Java中,没有无符号字节

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


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

我想你可以用一个简短的语句来存储它们。效率不是很高,但实际上除了我所看到的一些巨大的努力之外,这是唯一的选择。

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

这也是比我聪明的人(每个人)的建议


从数组中读取任何单个值时,将其复制为short或int之类的值,然后手动将负数转换为它应该是的正值

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
byte[]foobar=。。;
int值=foobar[10];
如果(值<0)值+=256//修补“错误”负值

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

执行位操作/无符号字节的最佳方法是使用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;
因此,最好只使用整数并屏蔽它,以获得您感兴趣的位。例如:

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基本类型的更多信息


最后一点需要注意的是,Java中有一个无符号的固定精度数字。这就是char原语。

使用int通常比使用short好,因为java在内部使用32位值(即使是字节,除非在数组中)因此,使用INT可以避免不必要地转换字节码中的短值。

如果这样做,实际上可以去掉if语句和加法

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

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

我知道这是一个非常晚的响应,但我在尝试做完全相同的事情时遇到了这个线程。问题只是试图确定Java字节是否大于127

简单的解决办法是:

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

如果真正的问题是>128,只需在If语句中添加另一个条件就可以了。

执行int-value=(foobar[10]&0xFF)更容易、更高效;也许吧,但我希望我的代码尽可能清晰、有教育意义。另外,我不知道在Java中,&对负整数有什么作用(至少在没有谷歌搜索的情况下是这样),所以我很安全。为什么要对负数做不同的处理呢。是一个布尔运算,它对单个位起作用,它知道、检查或关心一个数字是正数、负数还是任何其他值。我认为0xFF可能会被视为有符号字节(即-1),然后符号扩展为32位有符号整数(即0xFFFFFFFF aka-1),然后作为参数传递给“&”。这将给出不正确的结果。从讨论中可以清楚地看出,Java不会这样做,但我认为最好是安全起见。如果值总是一个字节(即8位),那么使用
byte
更清楚、更好地传达代码的意图,因此我会使用它来提高可读性,即使它使用与
int
相同的空间。这是非常正确的,虽然您在其中获得了额外的字节码来强制将值转换成字节或从字节中转换回来,但这会带来很小的开销。可读性>微小的无形优势。此外,如果你碰巧依赖于在某处使用
字节的库(想到Android上的USB堆栈),那么意识到
int
更适合你的预期目的也不会有帮助.关于效率的一个小提示:当将上述表达式编译成本机机器指令时,Java的Hotspot客户端VM将执行一个普通的字节到整数升级(with),然后执行AND操作。Hotspot服务器VM足够智能,可以进行零扩展的升级,跳过和。