簡體   English   中英

如何使用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_ _ __ _ __ __ _ _ _ __ __ _ __ __ _ _ _ 數據 _ __ __ _ __ _ __

我不明白為什么:(我猜這是因為大於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_srcip_dst拆包,因為您未指定其struct的內容。 讀取的最小值是一個字節,因此可以將第一個字段分為兩部分:

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

當然,8位分量的順序取決於您的結構耐久性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM