我在网上找到了这段代码,它作为我项目的一部分,但我不确定为什么。我不想在不了解它的情况下使用它。
type = (packet_data[12] << 8) | packet_data[13];
如果我使用它,我会得到正确的类型(IPv4的0x0800),可以用它进行比较,打印出它是IPv4还是IPv6。如果我不使用它并尝试类似:
if(packet_data[12] == 08 && packet_data[13] == 00)
print out IPv4
它不起作用(编译错误)。
此外,如果我只打印出像
这样的值printf"%02X", packet_data[12];
printf"%02X", packet_data[13];
它打印出0800表格中的正确值,但我需要打印出它是IPv4类型。这就是为什么我需要首先进行比较。感谢任何建议或解释,这将是非常感谢。感谢
答案 0 :(得分:1)
if(packet_data[12] == 08 && packet_data[13] == 00)
编译器将右侧文字操作数视为八进制基础文字。
幸运的是,8
无法表示八进制数,而且您收到编译错误。
你的意思是十六进制文字:
if (packet_data[12] == 0x8 && packet_data[13] == 0x0)
这一行:
(packet_data[12] << 8) | packet_data[13]
重新创建位于偏移12和12的数据的大端值(网络约定)。 13.在你的情况下,两者都是等价的,尽管后者更便于比较整个值。
答案 1 :(得分:0)
packet_data[12] << 8
获取第一个Ethertype八位字节并将其向左移8位到16位字的高8位。
| packet_data[13]
获取第二个Ethertype八位字节,并将其按位或运算到前一个16位字。
然后,您可以将其与IPv4的0x0800
或IPv6的0x86DD
进行比较;在https://en.wikipedia.org/wiki/EtherType#Examples
正如已经指出08
不起作用,因为以0
开头的数字代表八进制数,而八进制中不存在8
。