Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python读取保存在文件中的数据包? 我有一个C++代码,它生成一个IP包报头。代码使用表示数据包中每个字段的结构: 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]; };_Python_Packet Capture - Fatal编程技术网

如何使用Python读取保存在文件中的数据包? 我有一个C++代码,它生成一个IP包报头。代码使用表示数据包中每个字段的结构: 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]; };

如何使用Python读取保存在文件中的数据包? 我有一个C++代码,它生成一个IP包报头。代码使用表示数据包中每个字段的结构: 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]; };,python,packet-capture,Python,Packet Capture,提示用户输入消息以输入结构中每个变量的值: 输入保存数据包的文件名:packet 输入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

提示用户输入消息以输入结构中每个变量的值:

输入保存数据包的文件名:packet

输入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");
我试图在处理socket.makefile()时搜索另一个选项,但这将帮助我将程序中的socket作为文件,但我需要做的是解析此文件中提供给我的帧

有什么想法吗

谢谢


另外,有人能给我一个链接,在那里我可以找到如何在Python中将整型从大端数转换为小端数,以及如何使用VicServerSA。谢谢

您应该像往常一样读取文件(为Windows指定“二进制”模式):

要解包二进制数据,您应该使用package,它还可以处理等等。结构的示例:

print struct.unpack('BBHHHBBH100s', line)
我省略了
ip_src
ip_dst
解包,因为您没有指定其结构的内容。读取的最小可能值为一个字节,因此要将第一个字段分成两部分,可以使用:

(ip_hl, ip_v) = (value >> 4, value & 15)

当然,8位组件的顺序取决于您的结构端。

您应该像往常一样读取文件(为Windows指定“二进制”模式):

要解包二进制数据,您应该使用package,它还可以处理等等。结构的示例:

print struct.unpack('BBHHHBBH100s', line)
我省略了
ip_src
ip_dst
解包,因为您没有指定其结构的内容。读取的最小可能值为一个字节,因此要将第一个字段分成两部分,可以使用:

(ip_hl, ip_v) = (value >> 4, value & 15)

当然,8位组件的顺序取决于您的结构端。

谢谢Denis。IP地址结构是C++库中的一种结构,我猜是STDIO.H.H.,还有一些包从小到大字节(不是全部)转换的字段,如果我把小的字节数应用到所有的包上,会影响到什么?每个解包只能有一个字节数。但是,可以将特定字段从一个endianess重新解压到另一个endianess,或者只需将行按部分解压:首先使用一个endianess,然后使用
line[:offset]
解压其余的。非常有帮助。谢谢,丹尼斯,我很困惑。在您的示例中,您指的是字节,但我的理解是,数据类型uint16_t是16位而不是16字节,还是我错了?(如果我是,请纠正我)如果我是对的,我是否应该使用无符号字符来解包我的uint8_t字段和uint16_t的无符号缩写?等等,您对
uint8_t
的评论指出它由两个4字节字段组成。谢谢Denis。IP地址结构是C++库中的一种结构,我猜是STDIO.H.H.,还有一些包从小到大字节(不是全部)转换的字段,如果我把小的字节数应用到所有的包上,会影响到什么?每个解包只能有一个字节数。但是,可以将特定字段从一个endianess重新解压到另一个endianess,或者只需将行按部分解压:首先使用一个endianess,然后使用
line[:offset]
解压其余的。非常有帮助。谢谢,丹尼斯,我很困惑。在您的示例中,您指的是字节,但我的理解是,数据类型uint16_t是16位而不是16字节,还是我错了?(如果我是,请纠正我)如果我是对的,我是否应该使用unsigned char来解包我的uint8_t字段和uint16_t的unsigned short?等等,您对
uint8_t
的注释说明它由两个4字节字段组成。