我有两个字节类型的数据,(例如,它们是“0xFB”和“0X03”)。
我希望从这两个字节类型的数据中获取一个Integer类型的数据(它变为“0xFB03”)。
但是,在java中,字节类型数据是签名数据。
因此,它已成为:
byte b1=0xFB,b2=0x03;
int i=(b1<<8)+b2;
System.out.println(i);
结果是-1277(0xFFFFFB03),而不是我想要的64259(0xFB03)。
那么,如何从java中的字节类型中读取无符号数据类型。
答案 0 :(得分:2)
您只需阅读short
数据类型即可。它有16个字节,应该做你想要的。在java中没有无符号字节。
答案 1 :(得分:2)
Java中的典型方法是,如果要将byte
扩展为更宽的数据类型而不使用符号扩展,则应用& 0xff
(按位and
使用位掩码因此,字节的符号扩展版本再次被截断为低8位。
这就是你的代码:
byte b1 = (byte)0xFB, b2=0x03;
int i = ((b1 & 0xff) << 8) + (b2 & 0xff);
System.out.println(i);
因为Java没有无符号的8位数据类型,所以这几乎是标准的习惯用法:你会在代码中找到很多东西来处理从字节数组中构造更大的数值数据类型。
注意:您的原始源代码无法编译。表达式byte b1=0xFB
无效,因为0xFB
大于字节的最大值(127)。通过强制将0xFB强制转换为一个字节来修复它:byte b1 = (byte)0xFB
答案 2 :(得分:0)
Java将byte
和short
操作数转换为int
,然后将它们用作运算符的参数。 byte
是带符号的8位整数类型;因此,当将最高位为1的byte
值转换为int
时,结果将为负整数,在这种情况下为16xFFFFFFFB
。
您可以使用其他人建议的更宽整数类型。但是如果由于某种原因需要使用byte
,那么处理它的方法就像
int i = (((int)b1 & 0xFF) << 8) + ((int)b2 & 0xFF);
[我不认为(int)
转换是必要的,但它们对那些可能不了解Java二进制数字促销规则的读者很有帮助。]
在将字节转换为int
后,必须立即执行屏蔽,以使用0-255范围内的值。它不会进行计算,然后对结果应用掩码(当b2
在0x80-0xFF范围内时尝试)。
使用Java 8,您也可以这样做:
int i = (Byte.toUnsignedInt(b1) << 8) + Byte.toUnsignedInt(b2);