文件签名检测
看文件头几个字节:它到底是什么,以及名字有没有说谎。
只读前 512 字节,在浏览器里完成、不会上传。你会拿到真实格式、MIME 类型和头部字节 —— 以及当扩展名与内容不符时的明确警告。
什么时候会用到
- 文件打不开,你怀疑扩展名是错的 —— 有人把 PNG 改名成 .jpg,或者把 ZIP 改名成 .docx。
- 你正要因为一个名字去信任某个文件,想在信任之前做一次成本极低的核对。
- 下载下来的文件根本没有扩展名,需要先知道它是什么,才能决定用哪个程序打开。
- 上传被拒绝,提示「不是有效的图片」,你要分清是字节不对,还是解析器在挑刺。
别的文件类型检测工具差在哪里
多数工具读的是文件名,然后把扩展名报还给你。那正是你本来就有的信息,也正是你现在怀疑的东西。
在线检测站要求你先上传。对一个还没打开过的文件来说,这一刻恰恰是最不该把它交给第三方的时刻。
有些工具能列出一百种格式,却从不说「这两者对不上」,把比对的工作留给你自己 —— 而比对恰恰是唯一有意义的那部分。
还有的报的是操作系统猜的 MIME 类型,而那个猜测又是从扩展名来的。把猜测包装成测量结果。
文件签名对照表
每一行都是检测器实际执行的规则:某个偏移处的一段固定字节。一行里列出两组字节时,两组都必须匹配 —— 只有 RIFF 并不能说明它是 WebP;MP4 与 QuickTime 的区别就在偏移 8 处的 brand。
| 格式 | 扩展名 | 偏移 | 魔术字节(hex) | MIME 类型 |
|---|---|---|---|---|
| PNG | png | 0 | 89 50 4E 47 0D 0A 1A 0A | image/png |
| JPEG | jpg, jpeg, jpe, jfif | 0 | FF D8 FF | image/jpeg |
| GIF | gif | 0 | 47 49 46 38 | image/gif |
| WebP | webp | 0, 8 | 52 49 46 46 · 57 45 42 50 | image/webp |
| BMP | bmp, dib | 0 | 42 4D | image/bmp |
| TIFF(小端) | tif, tiff | 0 | 49 49 2A 00 | image/tiff |
| TIFF(大端) | tif, tiff | 0 | 4D 4D 00 2A | image/tiff |
| ICO / CUR | ico, cur | 0 | 00 00 01 00 | image/x-icon |
| AVIF | avif | 4, 8 | 66 74 79 70 · 61 76 69 66 | image/avif |
| HEIC / HEIF | heic, heif | 4, 8 | 66 74 79 70 · 68 65 69 63 | image/heic |
| 0 | 25 50 44 46 | application/pdf | ||
| GZIP | gz, tgz | 0 | 1F 8B | application/gzip |
| RAR | rar | 0 | 52 61 72 21 1A 07 | application/vnd.rar |
| 7-Zip | 7z | 0 | 37 7A BC AF 27 1C | application/x-7z-compressed |
| ZIP | zip | 0 | 50 4B 03 04 | application/zip |
| ZIP(空档案) | zip | 0 | 50 4B 05 06 | application/zip |
| ZIP(分卷) | zip | 0 | 50 4B 07 08 | application/zip |
| SQLite 3 | sqlite, db, db3 | 0 | 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 | application/vnd.sqlite3 |
| TAR | tar | 257 | 75 73 74 61 72 | application/x-tar |
| WAV | wav | 0, 8 | 52 49 46 46 · 57 41 56 45 | audio/wav |
| AVI | avi | 0, 8 | 52 49 46 46 · 41 56 49 20 | video/x-msvideo |
| Ogg | ogg, oga, opus | 0 | 4F 67 67 53 | audio/ogg |
| FLAC | flac | 0 | 66 4C 61 43 | audio/flac |
| MP3(ID3 标签) | mp3 | 0 | 49 44 33 | audio/mpeg |
| MP3(帧同步) | mp3 | 0 | FF FB | audio/mpeg |
| QuickTime MOV | mov | 4, 8 | 66 74 79 70 · 71 74 20 20 | video/quicktime |
| MP4 | mp4, m4v, m4a | 4 | 66 74 79 70 | video/mp4 |
| WebAssembly | wasm | 0 | 00 61 73 6D | application/wasm |
| ELF | elf, so, o | 0 | 7F 45 4C 46 | application/x-elf |
| PE(Windows EXE/DLL) | exe, dll, sys | 0 | 4D 5A | application/vnd.microsoft.portable-executable |
| Java class | class | 0 | CA FE BA BE | application/java-vm |
常见问题
文件签名是什么?
文件签名(也叫魔数)是文件开头一小段固定字节,用来标识格式。PNG 以 89 50 4E 47 开头,PDF 以字符 %PDF 开头,ZIP 以 PK 开头。打开文件的软件读的是这几个字节,扩展名只是给人看的。
为什么改了扩展名还是打不开?
因为程序按字节判断,不按名字判断。把 photo.png 改名成 photo.jpg,变的只是文件列表里那个标签,开头几个字节仍然是 PNG。有些程序会尝试嗅探内容来补救,所以改名后的文件有时能打开、有时显示成破图。
文件会被上传吗?
不会。页面用浏览器自己的文件接口只读前 512 字节,比对在 JavaScript 里完成。没有上传步骤,也没有可接收的服务器。你可以在拖入文件之前打开开发者工具的网络面板盯着看:一个请求都不会发。
为什么 DOCX 被识别成 ZIP?
因为它就是 ZIP。现代的 Office 文档、APK 安装包、JAR 包,都是内部结构特定的 ZIP 容器。要区分它们得读压缩包索引,本工具不读 —— 所以它如实报告「这是 ZIP」,而不是猜是哪一种 ZIP。
为什么文本文件没有签名?
因为纯文本没有文件头。TXT、JSON、CSV 以及大多数源码文件都直接从内容开始,不存在可匹配的魔数。本工具会明确说明这一点,而不是拿扩展名编一个格式出来。