好吧所以我在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中执行它。
非常感谢你!
答案 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'