我有一个生成IP数据包标头的C ++代码。代码使用表示数据包中每个字段的结构:
struct cip {
uint8_t ip_hl:4, /* both fields are 4 bytes */
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];
};
用户提示输入消息以输入结构中每个变量的值:
输入文件名以保存数据包:数据包
输入IP版本(0-15):4
输入标题长度(5-15):5
输入服务类型(0-255):55
输入数据包总大小(字节,20,200):25
创建数据包并将其保存在文件中:
FILE* f = fopen(file, "w");
int success = fwrite(&packet, sizeof(char), ((unsigned int)packet.ip_hl)*4,f);
if(success <= 0) {
printf("Error writing packet header");
}
success = fwrite(&data, sizeof(char),ntohs(packet.ip_len)-(4*packet.ip_hl),f);
if(success < 0) {
printf("Error writing packet data");
}
fflush(f);
fclose(f);
printf("\nPacket Written.\n");
我没有创建这个代码,有人给了我代码,所以我可以在Python中创建其他程序来验证上面程序创建的数据包。验证包括验证为数据包生成的校验和,Ip数据包的版本,协议,标头长度等。
所以我想知道是否有人可以帮我弄清楚如何阅读文件并解析框架。我试图将文件中的行作为字符串读取,但我遇到的问题是文件在创建后看起来像这样:(它是不可读的)
OÈ,@šÀ¨À¨ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDATA_的 _ __ _ __ _ __ _ __ _ __ < EM> _ __ _ __ _ DATA 的 _ __ < em> _ __ _ __ _ __ ô·
我不明白为什么:(我猜这是因为大于1字节的变量被函数“htons”转换为大端:
printf("\nEnter ip ID number(0-65535):\n");
scanf("%d", &input);
packet.ip_id = htons(input);
我尝试使用socket.makefile()来搜索另一个选项,但这会帮助我将程序中的套接字作为文件,但我需要做的是解析在这个文件中给我的框架
有什么想法吗?
感谢。
P.S。:还有人可以给我一个链接,我可以在这里找到如何将整数从big endian转换为small endian和vicerversa的Python。谢谢!
答案 0 :(得分:1)
您应该像往常一样阅读文件(为Windows指定“二进制”模式):
with open("test.txt", 'br') as f:
for line in f.readlines():
# process lines
要解压缩二进制数据,您应该使用struct
包,它也可以处理big and little endian等等。结构示例:
print struct.unpack('BBHHHBBH100s', line)
我省略了ip_src
和ip_dst
解压缩,因为您没有指定其结构的内容。要读取的最小值是一个字节,因此要将第一个字段拆分为两部分,您可以使用:
(ip_hl, ip_v) = (value >> 4, value & 15)
当然,8位组件的顺序取决于你的struct endianess。