用語集

ファイルの raw header とは何ですか?

raw header とは、ファイルの先頭のバイト列を16進数で表示したものです。これらのバイトから実際のファイル形式が分かり、多くのバイトはテキストとして読むことができます。

raw-header

Raw Header とは、ファイルの先頭部分を指し、名前付きのメタデータ項目としてではなく、1バイトずつ表示されるものです。多くのファイル形式は、シグネチャやマジックナンバーと呼ばれる決まったバイト列で始まります。プログラムはそのパターンを読み取り、ファイルの種類を判断します。

メタデータレポートでは、「Raw Header」欄に、これらのバイトが16進数として表示されます。89 や FF のような2文字の組み合わせ1つが、1バイトを表します。

メールにも、From・To・Subject などの項目を含むヘッダー部分が冒頭にありますが、この記事で扱うのはファイルのヘッダーです。

その値がどのように表示されるか

16進数(基数16)は、1バイトを 0〜9 の数字と A〜F の文字のうち2文字で表します。そのため、1バイトは 00 から FF までの任意の値を取ることができます。

ASCII 文字コードでは、21 から 7E の値が英字・数字・句読点を表し、20 はスペースを表します。20 未満の値は制御コードで、00 は NUL と呼ばれるすべてのビットが0の文字です。

raw header とはテキストとしてどのように読み取るか

Raw Header をテキストとして読むには、各バイトを 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 アーカイブ、および DOCX など ZIP ベースの Office ファイル: 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 バージョンを表しますが、ファイル中の後の項目がそれを上書きすることがあります。

どのファイルがそれを持っているか

すべてのファイルに Raw Header はありますが、すべての形式にシグネチャがあるわけではありません。プレーンテキストファイルは、先頭からすぐにテキストが始まります。プログラムは、先頭のバイトがテキスト文字だけで構成されていることから、そのようなファイルを判別します。

それが重要な理由

ファイル拡張子は名前の一部にすぎず、誰でも変更できます。拡張子が間違っている場合でも、ヘッダーを調べることで実際のファイルタイプやMIME タイプを知ることができます。

Web サーバーが MIME タイプを送らなかったり、ブラウザが受け取った MIME タイプが誤っていると判断したりする場合があります。そのときブラウザは、先頭のバイト列を既知のパターン表と比較することがあります。Unix の file コマンドは、ファイル先頭付近のマジックナンバーを探します。

ヘッダーは問題の発見にも役立ちます。photo.png という名前のファイルが 89 50 4E 47 で始まっていない場合、そのファイルはPNG 形式に従っていません。ファイルの先頭が破損しているか、別の種類のファイルに誤った拡張子が付いている可能性があります。

00 バイトだけからなるヘッダーは、一般的なシグネチャには一致しません。ただし、MP4 ファイルは最初の4バイトに小さなサイズが入り、その先頭が 0 の場合があるため、00 で始まることがあります。どのパターンにも一致せず、かつバイト列がテキストでもない場合、ブラウザはそのファイルを application/octet-stream として扱います。

メタキー