我正在解析一个写入二进制文件的数据包。我必须检索不同变量中的每个字段,因为我必须验证它们。在某些字段上使用 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