原始头部是文件的第一个部分,以字节为单位显示,而不是显示为带名称的元数据字段。许多文件格式以固定的字节模式开头,通常称为签名或魔数。程序通过读取这个模式来判断这是什么类型的文件。
在元数据报告中,“原始头部”字段以十六进制数字显示这些字节。每一对字符(例如 89 或 FF)代表 1 个字节。
电子邮件顶部也有一个头部部分,包含发件人、收件人和主题等字段。本文讨论的是文件的头部。
该数值的格式
十六进制(或称基数 16)使用数字 0 到 9 和字母 A 到 F,把每个字节写成 2 个字符。因此,一个字节可以有从 00 到 FF 的任意值。
在 ASCII 字符编码中,数值 21 到 7E 表示字母、数字和标点符号,20 表示空格。低于 20 的值是控制码,00 是名为 NUL 的全零字符。
如何将原始头部读取为文本
要把原始头部转换成文本,可以在 ASCII 表中查找每个字节。只有从 20 到 7E 的字节表示可见的 ASCII 字符或空格。其他字节不表示可见字符,所以通常只能读懂头部的一部分。
25 50 44 46 2D表示一个百分号、字母 PDF 和一个连字符。89 50 4E 47在第 2 到第 4 个字节中包含字母PNG。
典型值
常见格式以这些签名开头:
- PNG 图像:
89 50 4E 47 0D 0A 1A 0A - JPEG 图像:
FF D8 FF,其中FF D8标记图像开始 - GIF 图像:
47 49 46 38,然后是39 61或37 61(GIF89a 或 GIF87a) - PDF 文档:
25 50 44 46 2D,然后是版本号,例如 1.7 - TIFF 图像,小端序:
49 49 2A 00(II,然后是数字 42) - TIFF 图像,大端序:
4D 4D 00 2A(MM,然后是数字 42) - ZIP 压缩包,以及基于 ZIP 的 Office 文件(如 DOCX):
50 4B 03 04(PK) - 带 ID3v2 标签的 MP3 音频:
49 44 33(ID3) - WAV 音频:
52 49 46 46(RIFF),接着是 4 个可变字节,然后是57 41 56 45(WAVE) - MP4 视频:一个 4 字节的大小字段,然后是
66 74 79 70(ftyp)
在 TIFF 文件中,前 2 个字节还决定了文件中数字的字节序。在 PDF 文件中,签名后面的字符给出PDF 版本,但文件后面的某个条目可以覆盖它。
哪些文件携带它
每个文件都有原始头部,但并非每种格式都有签名。纯文本文件直接以文本开始。程序通过其前几个字节只包含文本字符来识别它们。
它的重要性
文件扩展名只是名称的一部分,而且任何人都可以修改。即使扩展名不正确,头部仍能揭示真实的文件类型和MIME 类型。
Web 服务器可能不发送 MIME 类型,或者浏览器可能认为收到的类型不正确。此时浏览器会把前几个字节与一张已知模式表进行对比。Unix 的 file 命令会在文件开头附近查找魔数。
头部也能帮助你发现问题。如果一个名为 photo.png 的文件不是以 89 50 4E 47 开头,它就不符合 PNG 格式。文件开头可能已损坏,或者该文件实际上是另一种类型,只是扩展名错误。
只由 00 字节组成的头部不匹配任何常见签名。但 MP4 文件可以以 00 开头,因为它前 4 个字节中的较小大小值是以零开头的。当没有任何匹配且这些字节又不是文本时,浏览器会把该文件视为 application/octet-stream。