按位运算符的解释

时间:2017-11-25 21:24:50

标签: c networking bitwise-operators

我在网上找到了这段代码,它作为我项目的一部分,但我不确定为什么。我不想在不了解它的情况下使用它。

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类型。这就是为什么我需要首先进行比较。感谢任何建议或解释,这将是非常感谢。感谢

2 个答案:

答案 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