libmagic库使用流程

✅ 正确流程:使用自定义 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=

data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">

注释用 # (Description) 格式

使用英文或 ASCII

✅ 第二步:编译生成 magic.mgc

1
2
file -C -m sat.magic

✅ 正确输出:

1
2
Creating magic.mgc from sat.magic

👉 生成了 magic.mgc,这是 唯一能被 magic_load() 正确加载的文件

✅ 第三步:修改你的 C 程序,加载 magic.mgc

你的 a.out 是从某个 .c 文件编译来的,假设是 detect_encoding.c。

编辑它:

1
2
vim 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.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

✅ 第四步:重新编译并运行

1
2
gcc -o a.out detect_encoding.c -lmagic

生成测试文件(确保有 GBK 文本)

1
2
3
4
5
6
7
8
9
cd ~/satellite-analysis-asscii

# 生成 GBK 编码文件
echo "卫星状态:正常
时间:2025-04-05
消息:系统在线" > gbk.txt

iconv -f UTF-8 -t GBK gbk.txt > gbk.bin

运行程序

1
2
./a.out 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

1
2
pip3 install cchardet

2. 创建 detect_gbk.py

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
import cchardet
import sys

with open(sys.argv&#91;1], 'rb') as f:
raw = f.read()
result = cchardet.detect(raw)
print(f"文件: {sys.argv&#91;1]}")
print(f"检测编码: {result&#91;'encoding']}")
print(f"置信度: {result&#91;'confidence']:.2f}")

3. 运行

1
2
python3 detect_gbk.py gbk.bin

✅ 输出:

1
2
3
检测编码: 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 编码

data-ad-format="auto" data-full-width-responsive="true">