✅ 正确流程:使用自定义 magic 的标准做法
1 | 编写 sat.magic(纯规则) |
✅ 第一步:创建正确的 sat.magic(仅规则,无扩展字段)
1 | cd ~/satellite-analysis-asscii/smagic |
✅ 内容(严格兼容 file -C):
1 | # Satellite Telemetry Frame |
✅ 关键:
不要写 name=, desc=, mime=
data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">注释用 # (Description) 格式
使用英文或 ASCII
✅ 第二步:编译生成 magic.mgc
1 | file -C -m sat.magic |
✅ 正确输出:
1 | Creating magic.mgc from sat.magic |
👉 生成了 magic.mgc,这是 唯一能被 magic_load() 正确加载的文件
✅ 第三步:修改你的 C 程序,加载 magic.mgc
你的 a.out 是从某个 .c 文件编译来的,假设是 detect_encoding.c。
编辑它:
1 | vim detect_encoding.c |
修改 magic_load 部分:
1 | // 原代码(错误): |
✅ 注意路径:./smagic/magic.mgc
✅ 第四步:重新编译并运行
1 | gcc -o a.out detect_encoding.c -lmagic |
生成测试文件(确保有 GBK 文本)
1 | cd ~/satellite-analysis-asscii |
运行程序
1 | ./a.out gbk.bin |
✅ 预期输出:
1 | 🔍 启动 libmagic 文本编码识别(C 语言版) |
⚠️ 注意:libmagic 仍可能将 GBK 误判为 iso-8859-1,因为两者都是“可打印扩展 ASCII”,但至少 你的自定义 magic 已正确加载。
✅ 如何让 GBK 被正确识别?—— 使用 cchardet
libmagic 不擅长文本编码识别。你应该:
1. 安装 cchardet
1 | pip3 install cchardet |
2. 创建 detect_gbk.py
1 | #!/usr/bin/env python3 |
3. 运行
1 | python3 detect_gbk.py gbk.bin |
✅ 输出:
1 | 检测编码: GBK |
🎯 成功识别!
✅ 最终建议:分工明确
任务工具识别文件类型(PNG/GZIP/ELF)✅ libmagic(C)识别文本编码(UTF-8/GBK/ASCII)✅ cchardet(Python)识别自定义协议帧(0xAA55…)✅ libmagic + 自定义 magic.mgc
🎯 你现在可以:
用 file -C 生成 magic.mgc
用 C 程序加载它,识别自定义卫星帧
用 Python + cchardet 精确识别 GBK 编码