已知單一封包的原始十六進制/二進制資料(含乙太網頭到 Payload),需產生標準 `.pcap` 檔案供 Wireshark 分析。
Global Header (24 bytes)
Packet Header 1 (16 bytes) → ts_sec, ts_usec, caplen, len
Packet Data 1 (caplen bytes)
Packet Header 2 ...
Packet Data 2 ...
| 欄位 | 說明 | 建議值 |
|---|---|---|
| magic_number | 檔案識別/位序 | `0xa1b2c3d4` (小端) |
| version_major/minor | 版本 | `2.4` |
| thiszone | 時區修正 | `0` |
| sigfigs | 時間戳精度 | `0` |
| snaplen | 最大擷取長度 | `65535` |
| network | 資料鏈路類型 | `1` (DLT_EN10MB 乙太網) |
| ts_sec/ts_usec | 封包時間戳 | 可全 `0` 或真實時間 |
| caplen | 實際擷取長度 | 封包資料長度(位元組) |
| len | 原始封包長度 | 通常等於 caplen |
#include
int main() {
const char *hex = "FFFFFFFFFFFF00112233445500AABBCCDDEEFF08004500..."; // 你的十六進制字串
size_t hex_len = strlen(hex);
size_t bin_len = hex_len / 2;
u_char *bin = malloc(bin_len);
for (size_t i = 0; i < bin_len; ++i) {
sscanf(hex + 2*i, "%2hhx", &bin[i]);
}
// 1. 開啟離線儲存器
pcap_t *pd = pcap_open_dead(DLT_EN10MB, 65535);
pcap_dumper_t *dumper = pcap_dump_open(pd, "manual.pcap");
// 2. 填寫封包頭
struct pcap_pkthdr hdr = {0};
hdr.ts.tv_sec = 0;
hdr.ts.tv_usec = 0;
hdr.caplen = bin_len;
hdr.len = bin_len;
// 3. 寫入封包
pcap_dump((u_char*)dumper, &hdr, bin);
// 4. 關閉
pcap_dump_close(dumper);
pcap_close(pd);
free(bin);
return 0;
}
import struct, binascii
hex_data = "FFFFFFFFFFFF00112233445500AABBCCDDEEFF08004500..."
bin_data = binascii.unhexlify(hex_data)
with open("manual.pcap", "wb") as f:
# Global Header: little-endian
f.write(struct.pack('
已知十六進制封包資料 → **二進制化 → 填寫 Global Header + Packet Header + Data → 寫入檔案**。C 语言用 `pcap_open_dead`/`pcap_dump` 最省力;Python 純標準庫亦可輕鬆完成。