✅ 正确流程:使用自定义 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 编码
此条目发表在未分类分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注