なんでこんなこと調べたのかというと、自分が過去作ったゲームのバックアップ データを飛ばしてしまい、どうしてもxp3ファイルから元データを引っ張り出す 必要に迫られたため。吉里吉里/KAGにデフォルトでそういうツールがついてない 理由は理解しているつもり。
ちなみに、「サイズ」などの数値データは、 全てリトルエンディアンで格納されていることに注意。
吉里吉里2.28まで | 吉里吉里2.30から | ||||||||
---|---|---|---|---|---|---|---|---|---|
セクション名 | データ名 | byte | データ例(16進数) | 備考 | セクション名 | データ名 | byte | データ例(16進数) | 備考 |
XP3ヘッダ | XP3ヘッダ1 | 8 | 58 50 33 0d 0a 20 0a 1a | 固定値 | ←同じ | ||||
XP3ヘッダ2 | 3 | 8b 67 01 | 固定値 | ←同じ | |||||
なし | クッション | クッションインデックス | 8 | 17 00 00 00 00 00 00 00 | 固定値 | ||||
なし | ヘッダマイナーバージョン | 4 | 01 00 00 00 | 今は固定値 | |||||
なし | クッションヘッダ | 1 | 80 | 固定値 | |||||
なし | インデックスサイズ | 8 | 00 00 00 00 00 00 00 00 | 今は0固定 | ファイル管理部のインデックス | 8 | - | 後述のファイル管理部が存在するXP3ファイル上の位置 | ←同じ |
ファイル管理部の並びを以下に示す。
ファイル管理部ヘッダ | |||
---|---|---|---|
データ名 | byte | データ例(16進数) | 備考 | 圧縮フラグ | 1 | - | 0 = 管理部非圧縮 1 = 管理部圧縮 |
圧縮管理部サイズ | 8 | - | 管理部非圧縮の場合は存在しない |
管理部サイズ | 8 | - | 圧縮されていた場合は、展開後のサイズ |
ここにファイル管理部の配列が入る(圧縮時は管理部配列をzlib圧縮したデータ) |
ファイル管理部(一つ) | ||||
---|---|---|---|---|
セクション名 | データ名 | byte | データ例(16進数) | 備考 |
File | 管理部ヘッダ | 4 | 文字列"File" | 固定値 |
この管理部のサイズ | 8 | - | これ以降のデータサイズであり、"File"と「この管理部のサイズ」自身は含まない | |
Info | infoヘッダ | 4 | 文字列"info" | 固定値 |
infoサイズ | 8 | - | 4+8+8+2+ファイル名長*2、すなわち、これ以降次のSegmentまでのバイト数 | |
フラグ | 4 | - | 0 = プロテクトなし 1<<31 = プロテクトあり 「プロテクト」とは「このデータ展開しないで欲しいなぁ」というフラグであり、 実際にデータに何か細工がしてあるわけではない。紳士協定というヤツ。 ここいらへんに書いてある。 |
|
展開後のファイルサイズ | 8 | - | - | |
格納されているファイルサイズ | 8 | - | - | |
ファイル名長 | 2 | - | wcharなので、/2されていることに注意(0x0bなら下のファイル名は22byte) | |
ファイル名 | ファイル名長に依存 | "s.y.s.t.e.m./.C.o.n.f.i.g...t.j.s." | WStringになっている(末尾の'\0'は存在しない)。また、相対パスになっており、ディレクトリ名を含む。ディレクトリ区切り記号は'\'ではなく'/'であることに注意 | |
Segment | segmentヘッダ | 4 | 文字列"segm" | 固定値 |
segmentサイズ | 8 | - | セグメント数*28(1セグメント管理部=28byteのため) | |
ここにセグメント管理部がセグメント数繰り返し入る | ||||
Adler-32 | Adler ID | 4 | 文字列"adlr" | 固定値 |
Adler長 | 8 | 04 00 00 00 00 00 00 00 | 現在はAdler長は4byteと決まっているので 4 固定 | |
Adler-32 | 4 | - | Adler-32 チェックサム(Wikipedia参照) |
「セグメント」が複数あるということは、一つのファイルを複数に分割して 格納していることを意味する。とはいえ、実際には複数に分割されることは 少ないみたい。セグメントごとに圧縮・非圧縮を指定でき、圧縮されている場合は、 データは例によってzlibで圧縮されている。
セグメント管理部(一つ) 28byte | |||
---|---|---|---|
データ名 | byte | データ例(16進数) | 備考 |
フラグ | 4 | - | 0 = 非圧縮 1 = 圧縮 |
オフセット | 8 | - | XP3ファイル中でのデータ開始位置 |
オリジナルサイズ | 8 | - | データの元サイズ |
格納サイズ | 8 | - | XP3ファイルに格納されているデータのサイズ。圧縮されている場合は元サイズより小さく、圧縮されていない場合は上の「オリジナルサイズ」と同じ |
Adler-32は、簡単なチェックサム値。md5sumのようなもの。まぁ…シカトしてよし。 実際、一部のデータには存在していなかった。 最近になって後から追加されたようだ。すなわち、今後も、 管理部のセクション(チャンクとも呼ぶ)は拡張され、追加されていく可能性がある。 ファイル管理部の各セクション先頭は