(でも肥やしあげすぎると根っこが腐っちゃうんだよね・・・orz)
えー! そんなわけでありまして! 再び正しい知識で再検証!
- ルートディレクトリからファイル名を探し、ファイルを探す
- ファイルが見つかったら、例の2バイトを読むことでファイル開始位置が解る
- この値は 論理セクタ位置 = データ領域開始位置 - 2 + ファイル開始位置 なんて式で論理セクタに変換できる
- 末尾の4バイトを読む。これはサイズを表しているので、これが1セクタ以下ならファイルは一個のセクタに収まっているので終了。
- すこしでも大きい場合、多セクタにつながっているのでFAT領域を読んで追いかける
- FAT領域は3バイトで2つを作っている(圧縮?)
- 先ほどの開始位置と照らし合わせる。それによって次につながっている論理セクタの位置がわかる
- この値がFF8〜FF9になれば、そこでファイルは終了
さて、じゃ、FAT領域の解読。例の表に当てはめると・・・
ウチのFAT(論理セクタ1)の状態
FAT番号 00 01 02 03 04 05 06 07
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x00000200 F0 FF FF 03 40 00 05 60 00 07 80 00
FAT番号 08 09 0A 0B 0C 0D 0E 0F
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x0000020D 09 A0 00 0B C0 00 0D E0 00 0F 00 01
FAT番号 10 11 12 13 14 15 16 17
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x0000021A 11 20 01 13 40 01 15 60 01 17 80 01
FAT番号 18 19 1A 1B 1C 1D 1E 1F
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x00000227 19 A0 01 1B C0 01 1D E0 01 1F 00 02
こういうふうになるわけか。そうするとこんな式でいいのかな?
if ( 開始ナンバー % 2 ==0 ) //偶数奇数で分ける
{
FAT頭 = 開始ナンバー * 3 / 2 + 0x00000200;
FAT尻 = FAT頭 + 2;
//ここで例に並べ替えを行い、二つの数値を取り出す//
次FAT = 1番目の値
}
else
{
FAT頭 = (開始ナンバー - 1) * 3 / 2 + 0x00000200 ;
FAT尻 = FAT頭 + 2;
//ここで例に並べ替えを行い、二つの数値を取り出す//
次FAT = 2番目の値
}
・・・この式で行くと、例のeuc.txtのファイル開始ナンバー(0x00AB)の情報が書いてあるFAT番地は・・・・2FF !?
FAT番号 AA AB
┌──┐
0x000002FF FF FF FF
こうなるはず! 2番目の数字を取り出すと・・・FFF !?
つまりファイルはこれで終了!!!
むむむ!? これでほんとにいいのかなぁ。(先のポカがあるから心配だ・・・