词典

什么是文件的原始头部?

原始头部以十六进制数字显示文件的前几个字节。这些字节揭示了文件的真实类型,你还可以将其中许多字节读作文本。

raw-header

原始头部是文件的第一个部分,以字节为单位显示,而不是显示为带名称的元数据字段。许多文件格式以固定的字节模式开头,通常称为签名或魔数。程序通过读取这个模式来判断这是什么类型的文件。

在元数据报告中,“原始头部”字段以十六进制数字显示这些字节。每一对字符(例如 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。