struct.pack 格式符
🎛️ r0capture 拼 pcap 时用的 struct.pack 格式符速查。
格式符首字符(字节序)
| 字符 | 字节序 | r0capture 用在 |
|---|---|---|
= | 本机序(x86 小端) | pcap 全局头、记录头 |
> | 大端(网络序) | IPv4 头、TCP 头 |
< | 小端 | (未用) |
! | 大端(同 >) | (未用) |
类型字符
| 字符 | C 类型 | 大小 |
|---|---|---|
B | unsigned char | 1 字节 |
H | unsigned short | 2 字节 |
I | unsigned int | 4 字节 |
i | signed int | 4 字节 |
r0capture 用的组合
| 格式 | 用途 |
|---|---|
=I | 本机序 uint32(pcap magic、长度、时间戳) |
=H | 本机序 uint16(pcap 版本) |
=i | 本机序 int32(时区偏移、actual length) |
>B | 大端 uint8(IPv4 Version+IHL、TTL、Protocol) |
>H | 大端 uint16(端口、Total Length、Flags) |
>I | 大端 uint32(IP 地址、seq、ack) |
为什么 =i 和 =I 混用
time.timezone 可能是负数(东区为负),用有符号 =i。actual length 同理用 =i。其余长度用无符号 =I。
示例
python
struct.pack(">I", 0xC0A80101) # 192.168.1.1 → b'\xc0\xa8\x01\x01'
struct.pack("=I", 0xa1b2c3d4) # magic → 小端机写出 b'\xd4\xc3\xb2\xa1'
struct.pack(">B", 0x45) # IPv4 Version+IHL → b'\x45'