从Python中的位串流中提取位

时间:2013-05-07 02:03:57

标签: python packet bits bitmask

我有一个写入IP数据包的二进制文件。我必须创建一个必须验证IP数据包中的每个字段的Python程序,所以我试图从文件(Ip数据包)解析每个字段。我遇到的问题是有两个4位长的字段(数据包的前2个字段),但我可以解包的最小数据(struct.pack)是1个字节。所以我试图对这些位进行位掩码以从数据包中提取它们,但我有一个错误,表明所拥有的位流被认为是一个字符串,并且我正在使用位掩码执行的AND操作是整数。是否有人知道两个如何从一长串比特中提取第一个和第二个4比特字?

到目前为止,这是我的代码:

while True:
        try:
            filename=raw_input('Enter the name of the file where the packet is: ')
            break
        except EOFError as e:
            pass
            print "You didn't enter a valid file name"
    #Reading packet from file and converting to little endian accordingly
     with open(filename, 'rb') as f:
        for line in f.readlines():
            mask1=0b1111
            mask2=0b00001111
            bit_hl=line & mask1
            bit_v= line & mask2

            pk_hl= struct.unpack('@B', bit_hl) #ip_hl
            print('\n',pk_hl)
            pk_v = struct.unpack('@B', bit_v)  #ip_v
            print('\n',pk_v)

...

数据包是从C ++程序生成的,数据包的结构是:

struct cip {
   uint8_t        ip_hl:4, /* both fields are 4 bits */
                  ip_v:4;
   uint8_t        ip_tos;
   uint16_t       ip_len;
   uint16_t       ip_id;
   uint16_t       ip_off;
   uint8_t        ip_ttl;
   uint8_t        ip_p;
   uint16_t       ip_sum;
   struct in_addr ip_src;
   struct in_addr ip_dst;
   char       head[100];
};

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试bytearray

mask1=0b11110000
mask2=0b00001111
with open(filename, 'rb') as fh:
    ba = bytearray(fh.readline())
    byte=ba[0]
    print byte & mask1    # might be 'print ord(byte & mask1)'...
    print byte & mask2

此外,您的mask1=0b1111mask2=0b00001111实际上是相同的值。我认为您打算使用mask1=0b11110000mask2=0b00001111