Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ IP头位顺序不清楚_C++_C_Ip_Pcap - Fatal编程技术网

C++ IP头位顺序不清楚

C++ IP头位顺序不清楚,c++,c,ip,pcap,C++,C,Ip,Pcap,我读了IP RFC,里面说IP头的前4位是版本。图中还显示位0至3为版本 但当我查看头的第一个字节(使用pcap lib捕获)时,我看到了这个字节: 0x45 这是一个版本4的IP头,但很明显,位4到7等于4,而不是我所期望的位0到3 我希望在第一个字节上执行按位and,0x0F将获得版本,但似乎我需要使用0xF0执行and 我错过什么了吗?理解错误?您应该阅读RFC: 每当一个八位组代表一个数字量时,该八位组中最左边的一位 图表是高阶或最高有效位。就是一点 标记为0的是最高有效位。例如,以下

我读了IP RFC,里面说IP头的前4位是版本。图中还显示位0至3为版本

但当我查看头的第一个字节(使用pcap lib捕获)时,我看到了这个字节:

0x45

这是一个版本4的IP头,但很明显,位4到7等于4,而不是我所期望的位0到3

我希望在第一个字节上执行按位and,0x0F将获得版本,但似乎我需要使用0xF0执行and

我错过什么了吗?理解错误?

您应该阅读RFC:

每当一个八位组代表一个数字量时,该八位组中最左边的一位 图表是高阶或最高有效位。就是一点 标记为0的是最高有效位。例如,以下 图表表示值170(十进制)

这意味着一切都是正确的,除了你的假设“前四位”是最不重要的,而那些是最重要的

例如,在包含标志和片段偏移量的第7和第8字节中,您可以按如下方式将它们分开(考虑伪代码,即使它是C#):

byte flagsAndFragmentHi=数据包[6];
字节碎片LO=数据包[7];
布尔flagReserved0=(flagsAndFragmentHi&0x80)!=0;
bool flagDontFragment=(flagsAndFragmentHi&0x40)!=0;
bool flagMoreFragments=(flagsAndFragmentHi&0x20)!=0;

int fragmentOffset=((flagsAndFragmentHi&0x1F)似乎是和endianness()的问题。我也考虑了endiannes,但意识到他得到了正确的结果。@Mormegil的答案是正确的。注意“endianness”sensu stricto指的是较大结构中字节的顺序,而不是字节内位的编号。需要明确的是,这仅适用于数字字段?标志字段是低位,即使它出现在字节的左位?但第七个字节由标志和数字字段的一部分组成,即片段偏移量。Can请澄清一下?我已经添加了一个示例。不,标志是高位(更重要的)位,因为它们出现在图表的左位(编号较低)。谢谢。这为我澄清了问题:-)
                        0 1 2 3 4 5 6 7
                       +-+-+-+-+-+-+-+-+
                       |1 0 1 0 1 0 1 0|
                       +-+-+-+-+-+-+-+-+
byte flagsAndFragmentHi = packet[6];
byte fragmentLo = packet[7];
bool flagReserved0 = (flagsAndFragmentHi & 0x80) != 0;
bool flagDontFragment = (flagsAndFragmentHi & 0x40) != 0;
bool flagMoreFragments = (flagsAndFragmentHi & 0x20) != 0;
int fragmentOffset = ((flagsAndFragmentHi & 0x1F) << 8) | (fragmentLo);