我正在尝试构建一个IP头。
IP标头包含以下字段:版本,IHL,DSCP等。我想填充一个字节数组,以便我可以以字节为单位存储信息。
然而,我感到困惑的是版本字段只有4位宽。国际人道法也只有4位宽。如何将这两个字段的值拟合为一个字节?我需要做位移吗?
E.g。版本= 4,IHL = 5.我需要创建一个等于0100 0101 = 45h或69十进制的字节。
答案 0 :(得分:0)
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
要在一个字节中创建包含Version和IHL的压缩字段,请尝试执行
{{1}}
这仅适用于版本和国际人道法是0到15之间的数字
答案 1 :(得分:0)
您可以这样做:
int a = 0x04;
a <<= 4;
a |= 0x05;
System.out.println(a);
基本上将0b00000100变为0b01000000,然后变为0b01000101。
答案 2 :(得分:0)
(byte) (4 << 4) | 5
这将值4移到左边,然后将低4位设置为值5。
00000100
值(4
)01000000
向左移动4位(<< 4
)00000101
另一个值(5
)01000101
#2和#3 |
)的结果
醇>
因为操作数是int
类型(即使它们是byte
个值,当int
之类的运算符对它们起作用时,它们会被提升为|
,最终结果需要将演员表存储在byte
。
如果在任何按位运算中使用byte
值作为操作数,则隐式转换为int
会导致意外结果。如果您要将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
答案 3 :(得分:-1)
仅仅因为一个字节是8位而你的值最多只能是4不是问题。额外的4位将始终为零。
因此,如果您存储1例如:
0000 0001
或15(这是最大值?):
0000 1111
答案 4 :(得分:-1)
Java中不可能进行字节转换。
但是,就逻辑而言,如果您希望版本和IHL在一个字节中,您可以使用以下
来完成byte value = (byte) (IHL | VERSION << 4);