------------------------------------------------------------------------------ Xxx分割ファイルの結合の方法 Copyright (c) 2003 Game Kits 2003/12/12 All Rights Reserved. ------------------------------------------------------------------------------- ■はじめに 「Xxx分割ファイルの結合の方法」を公開いたします。 これを元にXxx結合プログラムを作成して頂くのは、 もちろん自由です。また、あなたのソフトウェアに組み込み、 それを公開して頂くのも自由です。 ■Xxx分割ファイルの構成 +------------------------------+ | ヘッダー(3872バイト) | +------------------------------+ | 分割された元ファイルのデータ | +------------------------------+ | フッター(2バイト) | +------------------------------+ ■Xxx分割ファイルのヘッダー部分 struct TXxxHead { char Secret0[3561]; //この部分は全ファイル共通の値である char OrgName[279]; //元のファイル名('\0'終端文字列) u64 FileSize; //元のファイルサイズ(バイト) u64 UnitSize; //分割サイズ(バイト) u32 Secret1; u32 Secret2; u32 Secret3; u32 SplitNo; //分割番号(0から+1づつ) }; ■Xxx分割ファイルのフッター部分 struct TXxxFoot { u16 FileSum; }; ■型の意味 u8 unsigned 8ビット整数 u16 unsigned 16ビット整数(リトル・エンディアン) u32 unsigned 32ビット整数(リトル・エンディアン) u64 unsigned 64ビット整数(リトル・エンディアン) s64 signed 64ビット整数(リトル・エンディアン) ■ファイル分割数の求め方 //ファイル分割数を返す u32 GetSplitNum(void) { s64 unit; if (UnitSize == 0) return 1; s64 unit = UnitSize - 3874; return (u32)((FileSize + unit - 1) / unit); } 例 GetSplitNum() の戻り値が4の時、 SplitNo は0〜3が存在するはずである。 逆に0〜3がそろっていなければ結合できない。 ■手順1 D&DされたファイルAのチェック D&DされたファイルAの Secret0 値を確認する。 (Secret0 値は全ファイル共通値なので他の分割ファイルを参照するとよい) もしこの値が1バイトでも違えば、それはXxx分割ファイルでない。 よって、結合できない。 ■手順2 ファイルAの分割仲間を探す ファイルAと同じディレクトリにある全ファイルを調べる。 Xxx分割ファイルのヘッダーの Secret0 から Secret3 までの 値が全て同値ならば、それは分割仲間ファイルである。 SplitNo に分割番号(0からの値)が格納されている。 ファイル分割数は GetSplitNum() で求められる。 この分割数分のファイルが探索されるはずである。 分割数に足りなければ、結合することができない。 Xxx分割ファイルが同じディレクトリにコピーされていると、 分割数分を超えて検索されることがある。 この場合のサポートが必要である。 具体的には、同じファイルのどれか1つを取捨すれば良い。 ■手順3 分割ファイル群をチェックする [分割された元ファイルのデータ](Xxx分割ファイルの構成参照) のサイズを求めるには、次式を使う。 [元ファイルのデータ]のサイズ = その分割ファイルのサイズ - 3874 この[分割された元ファイルのデータ]をサイズ分、 1バイトづつ加算した値と FileSum(フッター) が等しければ、 ファイルは正常である。 例 u8 *data = 元ファイルのデータ; u64 size = その分割ファイルのサイズ - 3874; u64 i; u16 sum = 0; for (i = 0; i < size; ++i) { sum += (u16)data[i]; } if (sum != FileSum) { →分割ファイル破壊エラー } ■手順4 結合後のサイズをチェックする [分割された元ファイルのデータ]のサイズを分割数分、足しこんだ値が、 FileSize(ヘッダー) と同じならOK。 ■手順5 結合する [分割された元ファイルのデータ]を SplitNo(分割番号) 順につなげたものが、 結合後のファイルである。 元ファイル名は、ヘッダーの OrgName[279] に格納している。 以上で結合終了。 ------------------------------------------------------------------------------- Xxx分割 by Game Kits