0

我正在解析一个写入二进制文件的数据包。我必须检索不同变量中的每个字段,因为我必须验证它们。在某些字段上使用 struct 后出现错误:

(pk_dst,)=struct.unpack('!I', line[16:20])#ip_dst struct.error: unpack
requires a string argument of length 4

我已经搜索过这个错误,但似乎在每种情况下都是一个独特的问题。我不明白为什么 struct.unpack 可以完美地与 IP 地址源 (src) 配合使用,但对于目标 (dst) 却不是我有错误。

我的代码是:

with open(filename, 'rb') as f:
        for line in f.readlines():
            mask1=0b1110000
            mask2=0b0001111
            ba = bytearray(line)
            byte=ba[0]
            frstb=byte & mask1 
            pk_ver=frstb >> 4 #ip_vr
            print 'Ver:',pk_ver
            pk_hl=byte & mask2 #ip_hl
            print 'HL:',pk_hl
            #packet= struct.unpack('BBHHHBBHLL140s', line)
            (pk_tos,)= struct.unpack('!B', line[1]) #ip_tos
            print 'TOS:',pk_tos
            (pk_len,)=struct.unpack('!H', line[2:4])#ip_len
            print 'LEN:',pk_len
            (pk_id,)= struct.unpack('!H', line[4:6])#ip_id
            print 'ID=',pk_id
            (pk_off,)= struct.unpack('!H', line[6:8])#ip_off
            print 'OFF:',pk_off
            (pk_ttl,)=struct.unpack('@B', line[8])#ip_ttl
            print 'TTL:',pk_ttl
            (pk_p,)=struct.unpack('@B', line[9])#ip_p
            print'PROT:',pk_p
            (pk_chsum,)=struct.unpack('!H', line[10:12])#ip_sum
            print'CHSUM:',pk_chsum
            (pk_src,)=struct.unpack('!I', line[12:16])#ip_src
            print'SRC:',pk_src
            (pk_dst,)=struct.unpack('!I', line[16:20])#ip_dst

数据包的结构是 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 个字节。

HL:10 
Ver:4 
TOS:0 
Len:15360 
id:14082 
offset:64 
ttl:5 
Prot:6 
SUM:62141
src:167880896 
dst:184658112 
header:QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

4

0 回答 0