在python中的位操作麻烦

时间:2014-09-13 09:02:28

标签: python bit-manipulation

好吧所以我在python中构建了一个真正非常简单的网络嗅探器来捕获IP头,它以结构的形式返回它,使用结构库,我将这些结构解包为整数字符串或者什么都没有'必要的。现在我遇到了以下问题,我收到一个20字节的结构,7& 8字节,表示需要转换为二进制代码并且长度为16位的数字。例如:它可能是数字24576,一个16位长的数字,如果转换为16位,则为二进制数字

0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

现在,前三位: 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0表示关于IP报头的片段的标志。 前3位表示标志,另外13位表示片段偏移, 现在我的问题是这个,当我解压缩结构时,它返回数字,例如 24576 ,当它转换为bin时,它会取消不必要的零,因此二进制文件是:

1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

我不得不提问,第一个问题是,当我定义它的长度时,是否可以将数字转换成位? 例如,如果我想将十进制数字2转换为二进制数(即10)但使其长度为16位,那么它将是

0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

但没有使用zerofill函数,(我不知道二进制文件有多长,)

如果没有,那么从数字中隔离出三个第一位的最佳方法是什么,以及如何在python中执行它。

非常感谢你!

2 个答案:

答案 0 :(得分:1)

使用正确的格式说明符可以获得所需的零填充:

>>> '{:016b}'.format(2)
'0000000000000010'
>>> '{:016b}'.format(24576)
'0110000000000000'

要检查设置了哪些位并将其解压缩,您将使用与C中相同的方法:

>>> num = 24576
>>> for i in range(16):
...     if num & (1 << i):
...         print('Bit ', i, 'is set')
... 
Bit 13  is set
Bit 14  is set

答案 1 :(得分:0)

通常的方法是使用移位和掩码操作,因此对于高三位,使用right shift操作

>>> num = 24576
>>> top = num >> 13
>>> top
3
>>> bin(top)
'0b11'

对于较低的13,只需使用掩码(按位and操作)

>>> bot = num & 0x1fff
>>> bin(bot)
'0b0'