我正在尝试构建IP标头。
IP标头包含以下字段:版本,IHL,DSCP等。我想填充一个字节数组,以便可以将信息存储为字节。
但是让我感到困惑的是,“版本”字段只有4位宽。IHL也只有4位宽。如何将这两个字段的值都拟合为字节?我需要做移位吗?
例如,Version = 4,IHL =5。我需要创建一个字节,该字节等于0100 0101 = 45h或十进制69。
(byte) (4 << 4) | 5
这会将值4左移,然后将低4位设置为值5。
00000100
4
01000000
<< 4
00000101
5
01000101``|
由于操作数是int类型(即使它们是byte值,即使int操作员喜欢|对它们进行操作,它们也会被提升为类型),因此最终结果需要强制转换存储在中byte。
int
byte
|
如果byte在任何按位运算中将值用作操作数,则对的隐式转换int会导致意外的结果。如果要将a byte视为在该转换中未签名,请使用按位AND(&):
&
byte b = -128; // The byte value 0x80, -128d int uint8 = b & 0xFF; // The int value 0x00000080, 128d int i = b; // The int value 0xFFFFFF80, -128d int uintr = (b & 0xFF) | 0x04; // 0x00000084 int sintr = b | 0x04; // 0xFFFFFF84