0

我有一个写入 IP 数据包的二进制文件。我必须创建一个 Python 程序,它必须验证 IP 数据包中的每个字段,所以我试图解析文件(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];
};

谢谢你。

4

1 回答 1

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=0b1111和你mask2=0b00001111的价值真的是一样的。我认为你的意思是使用mask1=0b11110000mask2=0b00001111

于 2013-05-07T02:41:04.517 回答