RAR5 ファイル形式
RAR 5.0 形式の RAR アーカイブ。
- MIME タイプ
- application/x-rar-compressed
- 拡張子
- .rar
- カテゴリ
- アーカイブ・圧縮
マジックナンバー(ファイル署名)
| 0x00000000 | 526172211A070100 | Rar!···· | 'Rar!' RAR5 signature |
RAR5 形式について
RAR 5.0 は現行の WinRAR 独自形式で、リカバリレコードと強力な暗号化を備えています。8 バイトの署名が 01 00 で終わる点で、古い 4.x のレイアウトと見分けられます。署名から先は型付きブロックの連なりで、ブロック内のほぼすべてのフィールドは可変長整数(1 バイトあたり 7 ビットがデータ、最上位ビットが継続フラグ)です。つまりオフセット 12 より後ろには固定位置のフィールドが一つもありません。小さなアーカイブを小さいまま保つための設計ですが、その代わりバイト単位で読む側は目的の位置へ飛べず、先頭からデコードしながら進むしかありません。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 8 | RAR 5.0 signature | 52 61 72 21 1A 07 01 00 — 'Rar!' の 4 文字に 1A 07 01 00 が続きます。1A は DOS の EOF 文字なので、端末にアーカイブを cat してもそこで止まり、バイナリが垂れ流しになりません。 |
| 8 | 4 | Header CRC-32 | 仕様上は「header size フィールドから始まり、任意の extra area の末尾までを含むヘッダデータの CRC32」と定義されています。つまりブロック全体ではなく、この CRC 自身より後ろだけを対象にしています。 |
| 12 | 1-10 | Header size (variable-length integer) | 最初の可変長フィールドであり、固定オフセットに置かれる最後のフィールドでもあります。エンコードはリトルエンディアンの base 128 で、各バイトの下位 7 ビットがデータ、最上位ビットが「次のバイトが続く」を意味します。これ以降のオフセットはすべて、このフィールドが何バイトになったかに依存します。 |
| variable | 1+ | Header type | 1 = main archive header、2 = file header、3 = service header、4 = archive encryption header、5 = end of archive header。通常のアーカイブならオフセット 8 のブロックは type 1 ですが、ヘッダごと暗号化されている場合は type 4 になり、パスワードなしではそこから先を一切読めません。 |
| variable | 1+ | Header flags | 全ブロック共通のフラグです。0x0001 はフラグの後ろに extra area のサイズフィールドが続くこと、0x0002 は data area のサイズフィールドが続くことを意味します。この 2 ビットが、次に来る 2 つの可変長整数がそもそも存在するかどうかを決めます。 |
| variable | 1+ | Archive flags (main header only) | 0x0001 = マルチボリュームセットの 1 巻である、0x0002 = ボリューム番号フィールドがある、0x0004 = ソリッドアーカイブ、0x0008 = リカバリレコードがある、0x0010 = 変更に対してロックされている。 |
| variable | variable | File headers (type 2) | 格納ファイル 1 つにつき 1 ブロック。中身の CRC-32、圧縮後・圧縮前のサイズ、属性、更新日時、圧縮情報を各自が持ち、その直後にそのファイルのデータ領域が続きます。 |
| variable | variable | End of archive header (type 5) | ファイル内の最後のブロックです。このブロック自身のフラグ 0x0001 が立っていれば「このボリュームは最終巻ではない」という意味で、展開側はこれを見て「壊れている」ではなく「次のパートをよこせ」と判断します。 |
似た形式との見分け方
| 紛らわしい形式 | 見分け方 |
|---|---|
| RAR (4.x) | この 2 つのカタログエントリが別々に存在する理由そのもので、違いは 1 バイトと長さだけです。RAR 4.x は 7 バイトの 52 61 72 21 1A 07 00、RAR 5.0 は 8 バイトの 52 61 72 21 1A 07 01 00。どちらも 'Rar!' に 1A 07 が続き、7 バイト目が 00 か 01 かで決まります。署名より下は何一つ共有していません。ブロックのレイアウトもフィールドのエンコードも圧縮方式も別物なので、読む側はパースを始める前にこのバイトで分岐する必要があります。 |
| 7-Zip | 同じく高圧縮率を狙う Windows 系アーカイバで、先頭は 37 7A BC AF 27 1C です。用途が重なるうえ拡張子もよく取り違えられますが、リカバリレコードとネイティブのマルチボリューム分割を持つのは RAR だけ、自由に実装できるのは 7z だけです。 |
| ZIP | 50 4B 03 04 と 52 61 72 21。WinRAR は両方を読み書きするので、中身は ZIP なのに .rar というファイルもよくあります。判定は先頭 4 バイトで確定します。また ZIP と違って RAR は末尾から一定距離のところにディレクトリを持ちません。 |
| Self-extracting .exe | 仕様は署名の前に任意のデータが置かれることを許しており、SFX モジュールのサイズと内容は明示的に未定義です。読む側には「先頭から SFX モジュールの最大サイズまで探せ、その上限は 1 MB を超えないことを推奨する」と書かれています。したがって 4D 5A('MZ')で始まるファイルの数十 KB 先に RAR 署名が現れるのは、まったく正当な状態です。 |
| Multi-volume parts | セット内のどのボリュームも同じ 8 バイト署名を持つため、.part1.rar も .part2.rar も、古い .r00 も、すべて完全な RAR アーカイブとして判定されます。パートと単体を区別できるのは main header の archive flags(ボリュームを示す 0x0001、ボリューム番号がある 0x0002)と、end-of-archive ブロックのフラグだけです。 |
よくある壊れ方
- マルチボリュームセットの 1 巻が欠けている。最後のブロックが end-of-archive ヘッダではない、あるいはそのボリュームフラグが「まだ続きがある」と言っているため、展開側は破損を報告せず次のファイルを要求します。「RAR が壊れた」という報告で一番多いパターンですが、たいてい何も壊れていません。
- リカバリレコード付きアーカイブのビット腐食。RAR は前方誤り訂正を内蔵する数少ない形式で、作成時にリカバリレコードを付けてあれば、修復コマンドが本当に破損セクタをその場で再構築できます。付いていない場合、各 file header の CRC-32 は破損を検出こそしますが、元に戻す手段はありません。
- ソリッドアーカイブが局所的な破損を増幅する。main header の 0x0004 フラグが立っていると全ファイルが 1 本の連続ストリームとして圧縮されているため、1 バイトの破損がそのエントリだけでなく、同じソリッドグループ内のそれ以降すべてを道連れにします。
- ヘッダ暗号化を空アーカイブと勘違いする。オフセット 8 のブロックが type 4 のときはファイル名自体が暗号化されており、パスワードなしでは一覧すら取れないので、ツールには空のツリーが表示されます。アーカイブは無傷で、単に答えるのを拒んでいるだけです。
- テキストモード転送、または先頭へのバイト付加。付加は自己展開アーカイブでは合法で、署名を走査する読み取り側なら対応できますが、オフセット 0 決め打ちの判定器はファイルを不明と報告します。また圧縮データ内部で改行変換が起きた場合、署名もヘッダも綺麗に読めるのに、展開したファイルが全部 CRC エラーになります。
この形式の現在地
RAR の立ち位置は少し変わっています。技術的には優秀なのに、いつまでもニッチから出られない。理由は独自形式であることが実際に効いているからです。この形式を書けるのは RARLAB だけで、unrar のデコーダはソースこそ公開されていても「これを使って圧縮側を作ってはいけない」という条項が付いています。だから ZIP のような標準にはなりようがなく、OS が書き込み側を同梱することもありません。それでも生き残っているのは、既存のアーカイブが本当に大量にあること、そして他の形式が真似できない機能が 2 つあるからです。1 つはリカバリレコード、つまりアーカイブ自体に前方誤り訂正を持たせる仕組み。もう 1 つはマルチボリューム分割が形式レベルで組み込まれていることで、大きなファイルが 20 年にわたって連番のパートで配布されてきたのはこれが理由です。新規に作るなら選択肢はほぼ他へ移りました(受け渡しなら ZIP、Windows で圧縮率が欲しいなら 7z、Unix なら tar.zst や tar.xz)。今この形式を知っておく実用上の理由は、それでも .rar を渡されて開かなければならない場面があるからです。
RAR5 ファイルをこのサイトで開く
どれもブラウザ内で動きます。ファイルが端末から出ることはありません。
関連する形式
RAR5 と混同しやすい形式です。先頭バイトを見比べてください。