簡體   English   中英

如何在python struct中解壓縮可變長度數據

[英]How to unpack variable length data in python struct

我正在構建一個 p2p 應用程序,我需要在其中解壓縮來自跟蹤器的 udp 宣布響應。

announce response:

Offset      Size            Name            
0           32-bit integer  action        
4           32-bit integer  transaction_id
8           32-bit integer  interval
12          32-bit integer  leechers
16          32-bit integer  seeders
20 + 6 * n  32-bit integer  IP address
24 + 6 * n  16-bit integer  TCP port
20 + 6 * N

我需要從上表中讀取名稱字段中列出的所有數據,但是播種機、IP 地址和端口的值是可變的。

如何使用 python struct 正確解壓縮響應中的所有數據?

struct模塊對於解壓縮二進制數據非常有用。

action, transaction_id, interval, leechers, seeders = struct.unpack('>iiiii', announse_response)

然后,您必須遍歷其余數據以獲取所有 ip/port 數據:

ip_port_list = []
while True:
    try: ip_port_list.append(struct.unpack('>ih', announse_response))
    except: break

如果沒有結構,您將不得不逐字節讀取,然后轉換大端問題。

我經歷了同樣的掙扎,所以為此寫了一個簡單的包binread

from binread import formatclass, U32, U16, Array 

@formatclass
class Seeder:
    ip_addr = U32
    tcp_port = U16

@formatclass
class AnnounceResponse:
    action = U32
    transaction_id = U32
    interval = U32
    leechers = U32
    seeders = U32

    # `length` refers to the value of the previous `seeders` field
    seeder_data = Array(Seeder, length="seeders")

# `data` is a bytes object
resp = AnnounceResponse.read(data)

print(resp.transaction_id)
print(len(resp.seeder_data))
print(resp.seeder_data[0].tcp_port)

您可以選擇使用@formatclass(byteorder='little') (或'big' )為所有值指定字節順序。

完全披露,我是binread的作者。

暫無
暫無

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

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