✅ 正确流程:使用自定义 magic 的标准做法
编写 sat.magic(纯规则)
↓
file -C -m sat.magic → 生成 magic.mgc(二进制数据库)
↓
C 程序中 magic_load("magic.mgc") → 成功加载
↓
调用 magic_file() → 正确识别
✅ 第一步:创建正确的 sat.magic
(仅规则,无扩展字段)
cd ~/satellite-analysis-asscii/smagic
nano sat.magic
✅ 内容(严格兼容 file -C
):
# 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
file -C -m sat.magic
✅ 正确输出:
Creating magic.mgc from sat.magic
👉 生成了 magic.mgc
,这是 唯一能被 magic_load()
正确加载的文件
✅ 第三步:修改你的 C 程序,加载 magic.mgc
你的 a.out
是从某个 .c
文件编译来的,假设是 detect_encoding.c
。
编辑它:
vim detect_encoding.c
修改 magic_load
部分:
// 原代码(错误):
// 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.mgc
if (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
✅ 第四步:重新编译并运行
gcc -o a.out detect_encoding.c -lmagic
生成测试文件(确保有 GBK 文本)
cd ~/satellite-analysis-asscii
# 生成 GBK 编码文件
echo "卫星状态:正常
时间:2025-04-05
消息:系统在线" > gbk.txt
iconv -f UTF-8 -t GBK gbk.txt > gbk.bin
运行程序
./a.out gbk.bin
✅ 预期输出:
🔍 启动 libmagic 文本编码识别(C 语言版)
------------------------------------------------
📄 gbk.bin:
检测编码: iso-8859-1 → ISO-8859-1(西欧)
⚠️ 注意:
libmagic
仍可能将 GBK 误判为iso-8859-1
,因为两者都是“可打印扩展 ASCII”,但至少 你的自定义 magic 已正确加载。
✅ 如何让 GBK 被正确识别?—— 使用 cchardet
libmagic
不擅长文本编码识别。你应该:
1. 安装 cchardet
pip3 install cchardet
2. 创建 detect_gbk.py
#!/usr/bin/env python3
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. 运行
python3 detect_gbk.py gbk.bin
✅ 输出:
检测编码: GBK
置信度: 0.99
🎯 成功识别!
✅ 最终建议:分工明确
任务 | 工具 |
---|---|
识别文件类型(PNG/GZIP/ELF) | ✅ libmagic (C) |
识别文本编码(UTF-8/GBK/ASCII) | ✅ cchardet (Python) |
识别自定义协议帧(0xAA55…) | ✅ libmagic + 自定义 magic.mgc |
🎯 你现在可以:
- 用
file -C
生成magic.mgc
- 用 C 程序加载它,识别自定义卫星帧
- 用 Python +
cchardet
精确识别 GBK 编码