使用TCP / IP标头位进行简单操作

时间:2014-11-13 19:37:19

标签: python bit-manipulation bit-shift tcp-ip raw-sockets

我对使用位操作有两个疑问:

第一个是>>运营商。据我所知,这个运算符执行此操作

0001 0000>> 4 - > 0000 0001或此1111 0001,不确定它是否填充1或0

所以我有这段代码:

version_ihl = iph[0]
version = version_ihl >> 4
ihl = version_ihl & 0xF

假设IP版本是4:0100,IHL是5:0101

如果我这样做版本= version_ihl>> 4,结果将是

0100 0101 ---> 0000 0100,如果运营商>>不填写1,我已经读过它实际上,所以而不是IP Version = 4将是1111 0100,而不是4。

第二件事是这一行,如何用ihl = version_ihl & 0xF

计算ihl

最终结果是5,所以0000 0101并且据我所知,该运算符执行了所有1的掩码,因此0100 0101将保持不变。所以这两个问题是:

1.如何从0100 0101获得>> 4操作结果0000 0100如果>>应该填写1s?

2.如何从0100 0101获得结果0000 0101和& 0xF mask??

我发布的代码工作正常,所以解决方案就在那里,我只是想知道它为什么会这样。提前谢谢你,希望有人可以通过一些了解。

1 个答案:

答案 0 :(得分:1)

  1. >>运算符未填充"什么都有。 Python中的整数表现得好像它们具有无限数量的前导零(非负整数)或1(负整数)。右移只会丢弃 n 最低有效位。
  2. 0xF0b1111相同,后者又与0b00001111相同。你只是用那些掩盖了最不重要的nybble。
  3. 由于您要求提供更多详细信息:

    1. 您从0100 0101开始,右移4。那个完全等同于0000 0100 0101开头,右移4,这给你0000 0100。反过来,这与0100相同。
    2. 您使用0100 0101开始,并使用0xF屏蔽。 0xF只是1111,与0000 1111相同。因此,您可以获得0000 01010101