我有一个写入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];
};
谢谢。
答案 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=0b1111
和mask2=0b00001111
实际上是相同的值。我认为您打算使用mask1=0b11110000
和mask2=0b00001111