反馈

文件格式是怎么被识别的:魔数原理

电脑打开一个文件时是怎么知道它是图片还是压缩包的?很多人以为靠的是文件名后缀,但后缀只是给人看的提示,真正决定文件格式的,是文件内容开头几个字节里藏着的"魔数"。


目录

  1. 魔数是什么:文件头的身份标识
  2. 为什么不能只靠文件后缀判断格式
  3. 容器格式:光看魔数不够,还要看内部结构

1. 魔数是什么:文件头的身份标识

魔数(Magic Number)是绝大多数文件格式在文件开头固定写入的一段特征字节,作用类似"文件的身份证号"。比如 PNG 图片的前 8 个字节固定是 89 50 4E 47 0D 0A 1A 0A,ZIP 压缩包的前 4 个字节固定是 50 4B 03 04,PDF 文件开头固定是 25 50 44 46(对应 ASCII 字符 %PDF)。操作系统、程序、在线识别工具判断"这个文件到底是什么格式",靠的就是读取文件开头这几个固定字节,和已知的魔数特征库逐一比对,而不是依赖文件名。

2. 为什么不能只靠文件后缀判断格式

文件后缀(.jpg.zip.exe只是文件名的一部分,是给人类和操作系统提供的"提示",不是格式本身的强制约束——把一个 PNG 文件手动改名成 .jpg 后缀,图片查看器多数情况下依然能正常打开它(因为程序实际读取的是文件内容的魔数,不是单纯相信文件名后缀);反过来,如果把一个可执行脚本伪装成 .jpg 后缀发给别人,单看文件名根本无法察觉异常,必须读取文件内容的真实魔数才能识破。这也是文件格式识别工具存在的意义:读取文件真实内容特征,交叉核对文件名后缀是否一致,帮助发现"后缀被人为篡改、伪装成安全格式"这类潜在风险。

3. 容器格式:光看魔数不够,还要看内部结构

有一类"容器格式"仅凭最开头几个字节的魔数还不足以精确判断具体类型,需要进一步解析内部结构才能确定:

  • RIFF 容器:WAV 音频、AVI 视频文件都以相同的 RIFF 字符开头(这只是通用容器标识),要往后读取容器内部紧跟着的子类型标识(比如 WAVEAVI )才能区分到底是音频还是视频
  • ISO-BMFF 容器:MP4、MOV 等现代视频格式基于同一套容器规范,魔数特征相似,需要解析内部的 box(数据块)结构才能精确识别具体的子格式
  • ZIP 容器:一部分现代文件格式(比如 Office 的 .docx/.xlsx、Java 的 .jar)本质上就是重命名过的 ZIP 压缩包,魔数和普通 ZIP 完全一样,必须打开压缩包看内部的目录结构和特定文件才能判断这到底是一份 Word 文档还是一个 JAR 包

这也是为什么严谨的文件格式识别不能只匹配开头几个字节,还需要结合容器内部结构做二次判断,才能应对这类"外层容器相同、内层格式不同"的情况。


在线工具:文件格式识别