ByteScope

Word 文書(docx)ファイル形式

Office Open XML 形式の Microsoft Word 文書。

MIME タイプ
application/vnd.openxmlformats-officedocument.wordprocessingml.document
拡張子
.docx
カテゴリ
ドキュメント

マジックナンバー(ファイル署名)

0x00000000504B0304PK··'PK' — it is a ZIP

ZIP 内に '[Content_Types].xml' と 'word/' ディレクトリがあります。

Word 文書(docx)形式について

.docx は Open Packaging Conventions のパッケージ、つまり XML パーツと埋め込みメディアをエントリに持ち、リレーションシップファイルで互いを結んだ普通の ZIP アーカイブです。.zip にリネームして開けば文書の全体が見えます。word/document.xml に本文と段落構造、word/styles.xml に書式、word/media/ に画像。ファイルの先頭 30 バイトには 'Word' を示すものは何もなく、形式の判別は完全に ZIP のディレクトリに並ぶ名前だけで行われます。

ヘッダーの構造(バイト単位)

オフセット長さフィールド意味
04Local file header signature50 4B 03 04。.docx は ZIP であり、これはその最初のローカルファイルヘッダで、素のアーカイブや .apk、.epub の先頭にあるものとまったく同じです。このファイルを Word 文書たらしめている要素はもっと奥にあります。
42Version needed to extract必要な読み取り側の最小バージョンを 10 倍した値。ZIP のあらゆる整数と同じくリトルエンディアンです。Word が書くのは deflate を示す 20 で、無圧縮のエントリには 10 が現れます。
62General purpose bit flagここで一番効くのはビット 3 です。これが立っていると下にある CRC とサイズ 2 つがゼロになり、実際の値は圧縮データの後ろに続きます。Word はストリーミングで書いたかどうかによって、どちらの形でもパッケージを作ります。
82Compression method.docx のパーツはほぼすべて 8(deflate)です。XML は極めてよく縮み、1 ページ分のテキストは数 KB の XML が数百バイトになります。すでに圧縮済みのメディアは方式 0 のまま格納されることがあります。
102Last modified timeMS-DOS のパック形式の時刻で、時 5 ビット、分 6 ビット、2 秒刻みの秒 5 ビット。Word は自分が生成したパーツのタイムスタンプを正規化するので、ここから実際の編集日時が分かることはまずありません。本物の日付は docProps/core.xml にあります。
122Last modified dateMS-DOS のパック形式の日付で、1980 年起点の年 7 ビット、月 4 ビット、日 5 ビット。1980 年より前は表現できず、タイムゾーンもありません。
144CRC-32このパーツの非圧縮バイト列に対するチェックサム。1 エントリしかカバーしないので、最初のパーツの CRC は完璧なのに 3 つ先のパーツが壊れている .docx もあり得ます。
184Compressed sizeヘッダと可変長フィールドの後ろに続く deflate データのバイト数。FF FF FF FF なら読み手は ZIP64 の extra field を見に行きますが、.docx でそれが必要になることは実質ありません。
224Uncompressed sizeパーツの元の長さ。[Content_Types].xml なら数百〜数千バイトで、圧縮後との比はたいてい 5 対 1 より良くなります。
262File name length最初のエントリが [Content_Types].xml のときは 13 00(19 バイト)です。Word をはじめ OOXML の書き手はこれを必ず先頭に置きます。ファイル全体を通して、手にしているものの正体を示唆する最初のフィールドがここです。
282Extra field lengthWord が書いたパッケージではたいていゼロです。非ゼロなら ZIP64 のサイズ、Unix のパーミッション、高精度タイムスタンプなどで、Word ではなく再パックしたツールが足したものです。
3019First entry nameASCII バイトで [Content_Types].xml。このパーツはパッケージの地図で、アーカイブ内のすべての拡張子とすべての override に対してコンテンツタイプを列挙します。OPC はこれをパッケージのルートに置くことを要求しています。オフセット 30 にこれがあることが、種類を問わず OOXML であることを示す一番安上がりな肯定的テストです。
variablevariableword/document.xmlこのパッケージをブックでもスライドでもなく Word 文書にしているパーツです。固定オフセットにはないのでファイル末尾のセントラルディレクトリ経由で探しますが、そこに名前が現れることが決定的な判定になります。画像やスタイルへ結び付ける word/_rels/document.xml.rels も同様です。
-224End of central directory signature50 4B 05 06。アーカイブコメントが無ければ末尾から 22 バイトの位置にあります。読み手はここから始めて、指されたセントラルディレクトリをたどり、そこで初めてパッケージにどのパーツが入っているかを知ります。だから最初のヘッダが健全でも末尾を失った .docx はそもそも開きません。
-64Offset of the central directoryディレクトリが始まる絶対バイト位置で、コメントが空という同じ条件が付きます。ファイルの前に何かを足すとこの数値の基準がずれます。ダウンロードした文書で「Word がこのファイルを開けません」となる原因のほとんどはこれです。

似た形式との見分け方

紛らわしい形式見分け方
Excel ブック(xlsx)ローカルファイルヘッダの全フィールドが同一で、たいていは最初のエントリ名も同一です。どちらもオフセット 30 が [Content_Types].xml だからです。確実に分けられるのはファイル末尾のディレクトリだけで、ブックなら xl/workbook.xml と xl/ ツリー、文書なら word/document.xml と word/ ツリーが並びます。コンテンツタイプのパーツ自体も、ContentType が wordprocessingml.document で終わる Override で種類を宣言しています。
ZIP.docx は ZIP です。問題は ZIP かどうかではなく、どの ZIP かです。素のアーカイブには必須のエントリ名が一切ないので、判定は否定形ではなく肯定形にします。ルートに [Content_Types].xml があり、かつ _rels/.rels パーツがあること。両方そろっていなければ、たまたま XML が入っているだけの ZIP です。
OLE2 / CFB.docx が置き換えた側の形式です。Word 97-2003 の .doc は D0 CF 11 E0 A1 B1 1A E1 で始まる Compound File Binary コンテナで、中に文字どおり 'WordDocument' という名前のストリームがあります。.docx は 50 4B 03 04 で始まります。どちらも同じ Word で開きますし、Word は拡張子ではなくバイトを読んで判断します。名前を間違えたファイルが開いてしまい、名前が正しい壊れたファイルが開かないのはそのためです。
EPUBどちらもマークアップを詰めた ZIP パッケージで、'PK' で判定を止める素朴な検出器はどちらも取り違えます。EPUB は最初のエントリを完全に固定していて、'mimetype' を無圧縮・extra field なしで置き、オフセット 38 に application/epub+zip が来ます。対する OOXML はバイトレベルで何も固定せず、エントリ名で判別します。オフセット 30 が 'mimetype' なら、それは .docx ではありません。
docmマクロ有効の Word 文書で、hex エディタで見る範囲ではどこも .docx と同一です。違いは中に word/vbaProject.bin パーツがあることと、[Content_Types].xml の ContentType が異なることだけ。出所が信用できないファイルではこの組み合わせを確認する価値があります。目に見える違いは拡張子だけで、それはリネームひとつで消えるからです。

よくある壊れ方

  • 末尾が欠けている。ローカルヘッダも圧縮済みパーツも全部無傷なのにファイルが開かない、ということが起こります。ZIP の読み手は end-of-central-directory レコードから始めるのに、それが無いからです。復旧は 50 4B 03 04 を前方に探してローカルヘッダからディレクトリを組み直す作業で、.docx なら本文はたいてい完全に取り戻せます。
  • 先頭にバイトが付いた。HTML のエラーページや PHP の警告が .docx という名前で保存されると全体がずれ、セントラルディレクトリの絶対オフセットが見当違いの場所を指します。文書は丸ごと残っているのに Word は破損と報告します。50 4B 03 04 より前を削れば直ります。
  • テキストモード転送。deflate ストリーム内の改行変換はヘッダのフィールドもエントリ名も無傷のまま残すので、パッケージの一覧は完璧に出て、その後 Word が word/document.xml を展開するところで CRC 不一致になります。Word のバグに見えて、そうではない障害です。
  • 手で編集して再パックを誤った。パーツはただの XML なので編集は簡単で、間違えるのは zip し直すところです。フォルダ自体のディレクトリエントリを足す、エントリ名の大小文字を変える、XML 宣言の前に BOM を入れる。どれをやっても、あらゆる ZIP ツールが健全と言うパッケージを Word が拒否します。
  • word/media のパーツが途中で切れている。画像は普通の ZIP エントリなので、書き掛けの PNG が入っていても本文はまったく無傷で読めて、その画像だけが壊れたプレースホルダとして表示されます。CRC が合わないのはそのエントリだけです。

この形式の現在地

.docx はどこでも既定のワープロ形式であり、Microsoft の形式としては珍しく本物の公開標準です(ECMA-376 と ISO/IEC 29500)。Google ドキュメントも LibreOffice も Apple Pages も過不足なく読み書きできるのはそのおかげです。バイナリの .doc から移ったことで、Microsoft の外にも効く利点が 2 つ手に入りました。1 つは復旧しやすさで、本文がただの XML なのでパッケージが壊れても中身は生き残ります。もう 1 つはサイズで、圧縮された XML は同じ内容の compound file より劇的に小さくなります。解決しなかったのは実装間の再現性です。標準は巨大で、パーツ同士は深く絡み合っており、Microsoft 以外のエディタを一度通した文書は行間や段落番号やリストの字下げが微妙に変わって戻ってくることがよくあります。だから .docx は、共同で編集したり変更履歴付きでレビューしたりするものには第一候補で、どの端末でも見た目が同一でなければならないものには不向きです。そちらは PDF の役目です。実務上の弱点は、XML 詰めの ZIP が配送手段として都合が良すぎることでしょう。マクロ有効の兄弟 .docm はバイト単位でほぼ見分けが付かないので、メールフィルタは拡張子を信じずに毎回パッケージの中を開けざるを得ません。

Word 文書(docx)ファイルをこのサイトで開く

どれもブラウザ内で動きます。ファイルが端末から出ることはありません。

関連する形式

Word 文書(docx)と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
Excel ブック(xlsx)50 4B 03 04.xlsx
PowerPoint プレゼン(pptx)50 4B 03 04.pptx
ZIP50 4B 03 04.zip
OLE2 / CFBD0 CF 11 E0 A1 B1.doc
EPUB50 4B 03 04.epub

よくある質問

ファイルのマジックナンバーとは何ですか?

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。PNG は必ず 89 50 4E 47 で始まり、ZIP は 50 4B 03 04 で始まります。OS もブラウザも file コマンドも、拡張子を信用せずこのバイト列を読みます。だからファイル名を変えても中身の正体は変わりません。

マジックナンバーを自分で確認する方法は?

macOS や Linux なら xxd -l 16 ファイル名 で先頭 16 バイトが表示されます。Windows なら PowerShell で Format-Hex -Path ファイル名 -Count 16 です。あるいはこのサイトのファイル形式判別ツールにドロップすれば、ローカルでバイト列を読んで形式を教えてくれます。アップロードはありません。

2 つの形式が同じマジックナンバーを持つのはなぜ?

一方が他方の上に作られているからです。docx、xlsx、pptx、apk、jar、epub はすべて中身が ZIP アーカイブなので ZIP の署名で始まり、区別するには内部のエントリを見る必要があります。Java の class ファイルと macOS のユニバーサルバイナリはどちらも CA FE BA BE で始まり、直後のフィールドで見分けます。

マジックナンバーがまったくないファイルもある?

あります。XML、HTML、JSON、SVG、CSV といったテキストベースの形式には固定のバイト署名がないため、構造から判別します。先頭の <?xml 宣言、<svg 要素、あるいは { に続く引用符付きのキーなどです。これは確定ではなく推測なので、このリファレンスではそうした形式をプローブ判別として示しています。

マジックナンバーが一致すればそのファイルは安全?

いいえ。わかるのは形式であって、中身が無害かどうかではありません。正規の PDF や docx でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

Word 文書(docx)かもしれないファイルをお持ちですか?ファイル形式判別ツールで調べる — マジックナンバーをローカルで読み取ります。アップロードは一切ありません。またはすべての形式を見る。