从2或4个字节转换为有符号/无符号short / int
我必须将字节转换为有符号/无符号int或short。
下面的方法正确吗?哪个是签名的,哪个是未签名的?
字节顺序:LITTLE_ENDIAN
public static int convertTwoBytesToInt1(byte b1, byte b2) { return (int) ((b2 << 8) | (b1 & 0xFF));
}
VS。
public static int convertTwoBytesToInt2(byte b1, byte b2) { return (int) (( (b2 & 0xFF) << 8) | (b1 & 0xFF));
}
和
public static int convertFourBytesToInt1(byte b1, byte b2, byte b3, byte b4){ return (int) ((b4<<24)+(b3<<16)+(b2<<8)+b1);
}
VS。
public static int convertFourBytesToInt2(byte b1, byte b2, byte b3, byte b4){ return (int) (( (b4 & 0xFF) << 24) | ((b3 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b1 & 0xFF));
}
我 对这种转换形式感兴趣。谢谢!
回答:
convertXXXToInt1()
每对中的第一个方法()是带符号的,第二个(convertXXXToInt2()
)是无符号的。
但是,Java
int
始终是带符号的,因此,如果设置的最高位,b4
则convertFourBytesToInt2()
即使将其视为“无符号”版本,其结果也将为负。
假设byte
值b2
是-1或十六进制的0xFF。所述<<
操作者将导致其被“提升”到一个int
为-1,或0xFFFFFFFF值类型。移位8位后,将为0xFFFFFF00,移位24个字节后,将为0xFF000000。
但是,如果应用按位运算&
符,则高阶位将设置为零。这将丢弃标志信息。这是这两种情况的第一步,将详细介绍。
签:
byte b2 = -1; // 0xFFint i2 = b2; // 0xFFFFFFFF
int n = i2 << 8; // 0x0xFFFFFF00
未签名:
byte b2 = -1; // 0xFFint i2 = b2 & 0xFF; // 0x000000FF
int n = i2 << 8; // 0x0000FF00
以上是 从2或4个字节转换为有符号/无符号short / int 的全部内容, 来源链接: utcz.com/qa/421436.html