![](/img/trans.png)
[英]how to read a file that can be saved as either ansi or unicode in python?
[英]How to read packet saved in a file with Python?
我有一個生成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數據包的版本,協議,標頭長度等。
因此,我想知道是否有人可以幫助我弄清楚如何讀取文件並解析框架。 我試圖將文件中的行作為字符串讀取,但是我遇到的問題是創建后文件看起來像這樣:(不可讀)
ØE,@ SAA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDATA_ _ __ _ __ __ _ _ _ __ __ _ __ __ _ _ _ 數據 _ __ __ _ __ _ __ O·
我不明白為什么:(我猜這是因為大於1個字節的變量被函數“ htons”轉換為大端字節:
printf("\nEnter ip ID number(0-65535):\n");
scanf("%d", &input);
packet.ip_id = htons(input);
我嘗試搜索其他選項來處理socket.makefile(),但這將以文件的形式幫助我程序中的套接字,但是我需要做的就是解析此文件中給我的幀。
有任何想法嗎?
謝謝。
PS:也有人可以給我一個鏈接,在這里我可以找到如何在Python中將整數從大端轉換為小端,反之亦然。 謝謝!
您應該照常讀取文件(為Windows指定“二進制”模式):
with open("test.txt", 'br') as f:
for line in f.readlines():
# process lines
要解壓縮二進制數據,您應該使用struct
package,它也可以處理大小端字節序等。 您的結構示例:
print struct.unpack('BBHHHBBH100s', line)
我省略了ip_src
和ip_dst
拆包,因為您未指定其struct的內容。 讀取的最小值是一個字節,因此可以將第一個字段分為兩部分:
(ip_hl, ip_v) = (value >> 4, value & 15)
當然,8位分量的順序取決於您的結構耐久性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.