✅ 正确流程:使用自定义 magic 的标准做法
1 2 3 4 5 6 7 8 编写 sat.magic (纯规则) ↓ file -C -m sat.magic → 生成 magic .mgc(二进制数据库) ↓ C 程序中 magic_load("magic.mgc" ) → 成功加载 ↓ 调用 magic_file() → 正确识别
✅ 第一步:创建正确的 sat.magic(仅规则,无扩展字段)
1 2 3 cd ~/satellite-analysis-asscii/smagic nano sat.magic
✅ 内容(严格兼容 file -C): 1 2 3 4 5 6 7 8 9 10 11 12 13 # Satellite Telemetry Frame 0 belong 0xAA55CCDD >8 string \x01\x02\x03\x04 >8 string SAT-TELEMETRY# (Satellite Telemetry Packet) # GBK Chinese Text Detection 0 byte > 0xA0 >&0 byte < 0xFF >1 byte > 0xA0 >&1 byte < 0xFF # (Chinese GBK Text)
✅ 关键:
不要写 name=, desc=, mime=
注释用 # (Description) 格式
使用英文或 ASCII
✅ 第二步:编译生成 magic.mgc
✅ 正确输出:
1 2 Creating magic .mgc from sat.magic
👉 生成了 magic.mgc,这是 唯一能被 magic_load() 正确加载的文件
✅ 第三步:修改你的 C 程序,加载 magic.mgc
你的 a.out 是从某个 .c 文件编译来的,假设是 detect_encoding.c。
编辑它:
修改 magic_load 部分: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // 原代码(错误):// if (magic_load(magic, NULL) != 0 ) { ... }// 新代码:先加载默认库,再加载自定义库if (magic_load(magic, NULL) != 0 ) { fprintf(stderr, "Error loading default magic: %s\n" , magic_error(magic)); magic_close(magic); exit (1 ); }// 加载自定义 magic.mgcif (magic_load(magic, "./smagic/magic.mgc" ) != 0 ) { fprintf(stderr, "Error loading custom magic: %s\n" , magic_error(magic)); magic_close(magic); exit (1 ); }
✅ 注意路径:./smagic/magic.mgc
✅ 第四步:重新编译并运行
1 2 gcc -o a .out detect_encoding.c -lmagic
生成测试文件(确保有 GBK 文本) 1 2 3 4 5 6 7 8 9 cd ~/satellite-analysis-assciiecho "卫星状态:正常 时间:2025-04-05 消息:系统在线" > gbk.txt iconv -f UTF-8 -t GBK gbk.txt > gbk.bin
运行程序
✅ 预期输出:
1 2 3 4 5 6 🔍 启动 libmagic 文本编码识别(C 语言版) ------------------------------------------------ 📄 gbk.bin: 检测编码: iso-8859-1 → ISO-8859-1(西欧)
⚠️ 注意:libmagic 仍可能将 GBK 误判为 iso-8859-1,因为两者都是“可打印扩展 ASCII”,但至少 你的自定义 magic 已正确加载。
✅ 如何让 GBK 被正确识别?—— 使用 cchardet
libmagic 不擅长文本编码识别。你应该:
1. 安装 cchardet
2. 创建 detect_gbk.py 1 2 3 4 5 6 7 8 9 10 11 import cchardet import sys with open(sys.argv[1], 'rb' ) as f: raw = f.read() result = cchardet.detect(raw)print (f"文件: {sys.argv[1]}" )print (f"检测编码: {result['encoding']}" )print (f"置信度: {result['confidence']:.2f}" )
3. 运行 1 2 python3 detect_gbk.py gbk.bin
✅ 输出:
🎯 成功识别!
✅ 最终建议:分工明确
任务工具识别文件类型(PNG/GZIP/ELF)✅ libmagic(C)识别文本编码(UTF-8/GBK/ASCII)✅ cchardet(Python)识别自定义协议帧(0xAA55…)✅ libmagic + 自定义 magic.mgc
🎯 你现在可以:
相关阅读