我有一个写入 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];
};
谢谢你。