続きを読む。
2007年06月17日
2007年06月15日
ISO9660 その13 パステーブル
パステーブルには、ボリュームが持つ全てのディレクトリの階層情報とディレクトリの場所が記されています。
つまりディレクトリを親から順に辿らなくともショートカットできるわけですが、
それにはパステーブルを全て読み込む必要があります。
パステーブルは、単純に言うと パステーブルレコードというディレクトリの情報を記した構造体をつなげて並べたものです。
一つのパステーブルレコードは一つのディレクトリに対応し、 順番に番号が割り振られます。 ルートディレクトリが 1 です。 子ディレクトリのパステーブルレコードは、親ディレクトリのパステーブルレコードの番号を持っています。
パステーブルレコードは以下の規則に従って並べられます。
1. ディレクトリ階層順。ルートから順に、親が前、子が後。
2. 同じ階層では、親ディレクトリの番号が若い方から先。
3. 親が同じならば、名前(文字コード)順。
パステーブルは、L型とM型をそれぞれ用意します。 L型では パステーブルレコードの Location of Extent と Parent Directory Number をリトルエンディアンで、 M型ではビッグエンディアンで記述します。
また、もう一つづつ予備のパステーブルを用意することも出来ます。
個々のパステーブルレコードの構造は、次のとおりです。
Extended Attribute Record Length は、無ければ 0x00 です。
ディレクトリ識別子は、ディレクトリレコードと同様に、 ルートディレクトリでは1バイトの 0x00、 それ以外の一般的なディレクトリにはd/d1文字を使用します。
ディレクトリ識別子の長さが奇数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが偶数ならば、必要ありません。
パステーブルは、単純に言うと パステーブルレコードというディレクトリの情報を記した構造体をつなげて並べたものです。
一つのパステーブルレコードは一つのディレクトリに対応し、 順番に番号が割り振られます。 ルートディレクトリが 1 です。 子ディレクトリのパステーブルレコードは、親ディレクトリのパステーブルレコードの番号を持っています。
パステーブルレコードは以下の規則に従って並べられます。
1. ディレクトリ階層順。ルートから順に、親が前、子が後。
2. 同じ階層では、親ディレクトリの番号が若い方から先。
3. 親が同じならば、名前(文字コード)順。
パステーブルは、L型とM型をそれぞれ用意します。 L型では パステーブルレコードの Location of Extent と Parent Directory Number をリトルエンディアンで、 M型ではビッグエンディアンで記述します。
また、もう一つづつ予備のパステーブルを用意することも出来ます。
個々のパステーブルレコードの構造は、次のとおりです。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Length of Directory Identifier (LEN_DI) | ディレクトリ識別子の長さ |
| 1 | 1 | unsigned char | Extended Attribute Record Length | 拡張属性レコードの長さ |
| 2〜5 | 4 | unsigned long (L/M) | Location of Extent | ディレクトリの先頭位置 [LBN] |
| 6〜7 | 2 | unsigned short (L/M) | Parent Directory Number | 親ディレクトリの番号 |
| 8〜(8+LEN_DI-1) | LEN_FI | char[LEN_FI] | File Identifier | ディレクトリ識別子 |
| 8+LEN_DI | 1 | unsigned char | Padding Field | =0 全体を偶数にするため |
Extended Attribute Record Length は、無ければ 0x00 です。
ディレクトリ識別子は、ディレクトリレコードと同様に、 ルートディレクトリでは1バイトの 0x00、 それ以外の一般的なディレクトリにはd/d1文字を使用します。
ディレクトリ識別子の長さが奇数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが偶数ならば、必要ありません。
2007年06月11日
ISO9660 その12 ディレクトリとディレクトリレコード
ディレクトリは、単純に書くとそのディレクトリが持っている
ファイルやディレクトリの情報を記した構造体(ディレクトリレコード)をつなげて並べたものです。
ただ、個々のディレクトリレコードの大きさは、ファイル/ディレクトリの名前の長さによって異なります。
ディレクトリレコードは、次のようになっています。
ファイルの場合、Data Length はファイル本体のバイト数です。
ディレクトリの場合、Data Length は
ディレクトリが占有している論理ブロック数×論理ブロック当たりのバイト数
です。
また、Data Length に拡張属性の大きさは含みません。
表中の記録日時の構造(datetime_s)は次のとおりです。
こちらの年月日時分秒は文字ではなく数値です。 使われていなければ、全て 0x00 です。
西暦2156年問題があります。
ファイルフラグは次のとおりです。
隠しファイルのとき、ビット0を設定します。
ビット1でファイルかディレクトリかを判別します。
他は…大抵 0 です。
File Unit Size と Interleave Gap Size は、ファイルが分割されている時に使います。 ファイルが分割されていなければ 0 です。
Volume Sequence Number は、普通一つのボリューム内に全て記入するので、その場合 1 です。
ファイル/ディレクトリ識別子は、いわゆるファイル/ディレクトリ名です。
PVD から辿る場合、ファイル識別子は、次のようになっています。
ファイル名+0x2E+拡張子+0x3B+バージョン
0x2E = '.'
0x3B = ';'
拡張子は無い場合もあります。
バージョンは、1〜32767の数値を文字で記述します。 windows では 1 です。
各文字はd文字を使用します。
よって、
FILENAME.EXT;1
のように書かれています。
(文字数の制限は後まわし。)
EVD から辿る場合、文字はd1文字を使用します。
拡張子、版数などはありません。(当事者間の合意によります。)
ディレクトリでは、最初に自身のディレクトリレコードを、 次に親のディレクトリレコードを記録します。 自分自身のディレクトリ識別子には、1バイトの 0x00 を、 親ディレクトリのディレクトリ識別子には、1バイトの 0x01 を使います。 文字に Unicode のような2バイト文字を使う場合でも、 ファイル識別子の長さ(LEN_FI)を 1 と置き、 単一バイトの 0x00 と 0x01 を使用します。
なお、ルートディレクトリの識別子にも1バイトの 0x00 を使います。 ルートディレクトリ内の親ディレクトリ(0x01)もルートディレクトリ自身を示します。 (無いこともあります。)
それ以外の一般的なディレクトリの識別子にはd/d1文字を使用します。
ファイル識別子の長さが偶数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが奇数ならば、必要ありません。
System Use は、ファイル名の長さにかかわらず ディレクトリレコードの長さを同じにしたい場合(たまにある)など、 ディレクトリレコード間に隙間を空ける時に使います。
なお、ディレクトリレコードが論理ブロックを跨がないように、 論理ブロックの終わりのほうを 0x00 で埋める必要があります。
ただ、個々のディレクトリレコードの大きさは、ファイル/ディレクトリの名前の長さによって異なります。
ディレクトリレコードは、次のようになっています。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Length of Directory Record (LEN_DR) | このディレクトリレコードの長さ [BYTE] |
| 1 | 1 | unsigned char | Extended Attribute Record Length | 拡張属性レコードの長さ(無ければ0) |
| 2〜5 | 4 | unsigned long | Location of Extent | ディレクトリまたはファイル本体の先頭位置 [LBN] |
| 6〜9 | 4 | unsigned long (M) | Location of Extent | 上に同じ |
| 10〜13 | 4 | unsigned long | Data Length | ディレクトリまたはファイル本体の大きさ [BYTE] |
| 14〜17 | 4 | unsigned long (M) | Data Length | 上に同じ |
| 18〜24 | 7 | struct datetime_s | Recording Date and Time | 記録日時 |
| 25 | 1 | unsigned char | File Flags | ファイルフラグ |
| 26 | 1 | unsigned char | File Unit Size | ファイルユニットの大きさ |
| 27 | 1 | unsigned char | Interleave Gap Size | インタリーブ間隙の大きさ |
| 28〜29 | 2 | unsigned short | Volume Sequence Number | ボリューム順序番号 |
| 30〜31 | 2 | unsigned short (M) | Volume Sequence Number | 上に同じ |
| 32 | 1 | unsigned char | Length of File Identifier (LEN_FI) | ファイル識別子の長さ(LEN_FI) |
| 33〜(33+LEN_FI-1) | LEN_FI | char[LEN_FI] | File Identifier | ファイル/ディレクトリ識別子 |
| 33+LEN_FI | 1 | unsigned char | Padding Field | =0 全体を偶数にするため |
| (LEN_DR-LEN_SU)〜(LEN_DR-1) | LEN_SU | char[LEN_SU] | System Use | システム用 |
ファイルの場合、Data Length はファイル本体のバイト数です。
ディレクトリの場合、Data Length は
ディレクトリが占有している論理ブロック数×論理ブロック当たりのバイト数
です。
また、Data Length に拡張属性の大きさは含みません。
表中の記録日時の構造(datetime_s)は次のとおりです。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Number of years since 1900 | 西暦年 - 1900 |
| 1 | 1 | unsigned char | Month of the year from 1 to 12 | 月 |
| 2 | 1 | unsigned char | Day of the month from 1 to 31 | 日 |
| 3 | 1 | unsigned char | Hour of the day from 0 to 23 | 時 |
| 4 | 1 | unsigned char | Minute of the hour from 0 to 59 | 分 |
| 5 | 1 | unsigned char | Second of the minute from 0 to 59 | 秒 |
| 6 | 1 | char | Offset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) | グリニッジ標準時からの偏差(15分単位) |
こちらの年月日時分秒は文字ではなく数値です。 使われていなければ、全て 0x00 です。
西暦2156年問題があります。
ファイルフラグは次のとおりです。
| ビット | 名称 | 内容 |
| 0 | Existence | 0=可視ファイル / 1=不可視ファイル |
| 1 | Directory | 0=ファイル / 1=ディレクトリ |
| 2 | Associated File | 0=主ファイル / 1=関連ファイル |
| 3 | Record | 0=ファイルがレコード形式を持たない / 1=レコード形式を持つ |
| 4 | Protection | 0=許可条件無効 / 1=許可条件有効 |
| 5 | Reserved | 予約(=0) |
| 6 | Reserved | 予約(=0) |
| 7 | Multi-Extent | 0=ファイルの最終ディレクトリレコードである / 1=ファイルの最終ディレクトリレコードでない |
隠しファイルのとき、ビット0を設定します。
ビット1でファイルかディレクトリかを判別します。
他は…大抵 0 です。
File Unit Size と Interleave Gap Size は、ファイルが分割されている時に使います。 ファイルが分割されていなければ 0 です。
Volume Sequence Number は、普通一つのボリューム内に全て記入するので、その場合 1 です。
ファイル/ディレクトリ識別子は、いわゆるファイル/ディレクトリ名です。
PVD から辿る場合、ファイル識別子は、次のようになっています。
ファイル名+0x2E+拡張子+0x3B+バージョン
0x2E = '.'
0x3B = ';'
拡張子は無い場合もあります。
バージョンは、1〜32767の数値を文字で記述します。 windows では 1 です。
各文字はd文字を使用します。
よって、
FILENAME.EXT;1
のように書かれています。
(文字数の制限は後まわし。)
EVD から辿る場合、文字はd1文字を使用します。
拡張子、版数などはありません。(当事者間の合意によります。)
ディレクトリでは、最初に自身のディレクトリレコードを、 次に親のディレクトリレコードを記録します。 自分自身のディレクトリ識別子には、1バイトの 0x00 を、 親ディレクトリのディレクトリ識別子には、1バイトの 0x01 を使います。 文字に Unicode のような2バイト文字を使う場合でも、 ファイル識別子の長さ(LEN_FI)を 1 と置き、 単一バイトの 0x00 と 0x01 を使用します。
なお、ルートディレクトリの識別子にも1バイトの 0x00 を使います。 ルートディレクトリ内の親ディレクトリ(0x01)もルートディレクトリ自身を示します。 (無いこともあります。)
それ以外の一般的なディレクトリの識別子にはd/d1文字を使用します。
ファイル識別子の長さが偶数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが奇数ならば、必要ありません。
System Use は、ファイル名の長さにかかわらず ディレクトリレコードの長さを同じにしたい場合(たまにある)など、 ディレクトリレコード間に隙間を空ける時に使います。
なお、ディレクトリレコードが論理ブロックを跨がないように、 論理ブロックの終わりのほうを 0x00 で埋める必要があります。
2007年06月09日
2007年06月07日
ISO9660 その11 VDT
Volume Descriptor Set Terminator (VDT)(ボリューム記述子集合終端子)は、
ボリューム記述子群の終端を示すもので、ISO9660及びその派生、拡張形式には
必ず一つは存在します。その構造は、次のとおりです。
最初のバイトが 255 ならば、ボリューム記述子群はここまで、ということです。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Volume Descriptor Type | =255 |
| 1〜5 | 5 | char[5] | Standard Identifier | ="CD001" |
| 6 | 1 | unsigned char | Volume Descriptor Version | 大抵 =1 |
| 7〜2047 | 2041 | unsigned char[2041] | (Reserved for future standardization) | =0 |
最初のバイトが 255 ならば、ボリューム記述子群はここまで、ということです。
2007年06月05日
ISO9660 その10 Boot Record
Boot Record (BR)(ブートレコード)は使ったことがないので、
表のみ書いておきます。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | char | Volume Descriptor Type | =0 |
| 1〜5 | 5 | char[5] | Standard Identifier | ="CD001" |
| 6 | 1 | unsigned char | Volume Descriptor Version | 大抵 =1 |
| 7〜38 | 32 | char[32] | Boot System Identifier | 起動システム識別子 (a文字) |
| 39〜70 | 32 | char[32] | Boot Identifier | 起動識別子 (a文字) |
| 71〜2047 | 1977 | unsigned char[1977] | Boot System Use | 起動システム用 |
2007年06月03日
ISO9660 その9 VPD
Volume Partition Descriptor (VPD)(ボリューム区画記述子)は使ったことがないので、
表のみ書いておきます。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Volume Descriptor Type | =3 |
| 1〜5 | 5 | char[5] | Standard Identifier | ="CD001" |
| 6 | 1 | unsigned char | Volume Descriptor Version | 大抵 =1 |
| 7 | 1 | unsigned char | Unused Field | =0 |
| 8〜39 | 32 | char[32] | System identifier | システム識別子 (a文字) |
| 40〜71 | 32 | char[32] | Volume Partition Identifier | ボリューム区画識別子 (d文字) |
| 72〜75 | 4 | unsigned long | Volume Partition Location | ボリューム区画の先頭位置 [LBN] |
| 76〜79 | 4 | unsigned long (M) | Volume Partition Location | 上に同じ |
| 80〜83 | 4 | unsigned long | Volume Partition Size | ボリューム区画の大きさ [Blocks] |
| 84〜87 | 4 | unsigned long (M) | Volume Partition Size | 上に同じ |
| 88〜2047 | 1960 | unsigned char[1960] | System Use | システム用 |
2007年06月01日
ISO9660 その8 SVD/EVD
Supplementary Volume Descriptor (SVD)(副ボリューム記述子)
と Enhanced Volume Descriptor (EVD)(拡張ボリューム記述子)の構造は
PVD と同じですが、入れる値が異なります。
Escape Sequences には、ISO/IEC 2022 のエスケープシーケンスを入れます。 これがあると、ファイル名などに多種の文字が使用できるようになりますが、 読み取る側がそのエスケープシーケンスに対応していないと無駄です。
全て 0 であれば ISO/IEC 646 となり、a 文字と d 文字しか使えません。
各日時は、PVD と同じです。つまり、年月日時分秒1/100秒にはd文字を使います。
System identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier が a 文字から a1 文字に、 Volume Identifier、Volume Set Identifier、Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が d 文字から d1 文字に、 それぞれ変更されています。
エスケープシーケンスの補足と疑問
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Volume Descriptor Type | =2 |
| 1〜5 | 5 | char[5] | Standard Identifier | ="CD001" |
| 6 | 1 | unsigned char | Volume Descriptor Version | =1(SVD), =2(EVD) |
| 7 | 1 | unsigned char | Volume Flags | ビット0 : 0=ISO2375登録のエスケープシーケンスのみ / 1=ISO2375登録外のエスケープシーケンスが含まれる |
| 8〜39 | 32 | char[32] | System identifier | システム識別子 (a1文字) |
| 40〜71 | 32 | char[32] | Volume Identifier | ボリュームラベル (d1文字) |
| 72〜79 | 8 | char[8] | Unused Field | =0 |
| 80〜83 | 4 | unsigned long | Volume Space Size | ボリュームの大きさ [Blocks] |
| 84〜87 | 4 | unsigned long (M) | Volume Space Size | 上に同じ |
| 88〜119 | 32 | char[32] | Escape Sequences | エスケープシーケンス |
| 120〜121 | 2 | unsigned short | Volume Set Size | ボリューム集合の大きさ |
| 122〜123 | 2 | unsigned short (M) | Volume Set Size | 上に同じ |
| 124〜125 | 2 | unsigned short | Volume Sequence Number | ボリューム順序番号 |
| 126〜127 | 2 | unsigned short (M) | Volume Sequence Number | 上に同じ |
| 128〜129 | 2 | unsigned short | Logical Block Size | 論理ブロックの大きさ [BYTE] 大抵2048 |
| 130〜131 | 2 | unsigned short (M) | Logical Block Size | 上に同じ |
| 132〜135 | 4 | unsigned long | Path Table Size | パステーブルの大きさ [BYTE] |
| 136〜139 | 4 | unsigned long (M) | Path Table Size | 上に同じ |
| 140〜143 | 4 | unsigned long | Location of Occurrence of Type L Path Table | L形パステーブルの先頭位置 [LBN] |
| 144〜147 | 4 | unsigned long | Location of Optional Occurrence of Type L Path Table | 任意L形パステーブルの先頭位置 [LBN] |
| 148〜151 | 4 | unsigned long (M) | Location of Occurrence of Type M Path Table | M形パステーブルの先頭位置 [LBN] |
| 152〜155 | 4 | unsigned long (M) | Location of Optional Occurrence of Type M Path Table | 任意M形パステーブルの先頭位置 [LBN] |
| 156〜189 | 34 | struct directory_record | Directory Record for Root Directory | ルートディレクトリのディレクトリレコード |
| 190〜317 | 128 | char[128] | Volume Set Identifier | ボリューム集合識別子 (d1文字) |
| 318〜445 | 128 | char[128] | Publisher Identifier | 出版者識別子 (a1文字) |
| 446〜573 | 128 | char[128] | Data Preparer Identifier | データ編集者識別子 (a1文字) |
| 504〜701 | 128 | char[128] | Application Identifier | 応用システム識別子 (a1文字) |
| 702〜738 | 37 | char[37] | Copyright File Identifier | 著作権ファイル識別子 (d1文字) |
| 739〜775 | 37 | char[37] | Abstract File Identifier | 抄録ファイル識別子 (d1文字) |
| 776〜812 | 37 | char[37] | Bibliographic File Identifier | 書誌ファイル識別子 (d1文字) |
| 813〜829 | 17 | struct datetime_l | Volume Creation Date and Time | ボリューム作成日時 |
| 830〜846 | 17 | struct datetime_l | Volume Modification Date and Time | ボリューム更新日時 |
| 847〜863 | 17 | struct datetime_l | Volume Expiration Date and Time | ボリューム失効日時 |
| 864〜880 | 17 | struct datetime_l | Volume Effective Date and Time | ボリューム発効日時 |
| 881 | 1 | unsigned char | File Structure Version | ファイル構造版数 =1 |
| 882 | 1 | unsigned char | Reserved | =0 |
| 883〜1394 | 512 | unsigned char[512] | Application Use | =0 |
| 1395〜2047 | 653 | unsigned char[653] | Reserved | =0 |
Escape Sequences には、ISO/IEC 2022 のエスケープシーケンスを入れます。 これがあると、ファイル名などに多種の文字が使用できるようになりますが、 読み取る側がそのエスケープシーケンスに対応していないと無駄です。
全て 0 であれば ISO/IEC 646 となり、a 文字と d 文字しか使えません。
各日時は、PVD と同じです。つまり、年月日時分秒1/100秒にはd文字を使います。
System identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier が a 文字から a1 文字に、 Volume Identifier、Volume Set Identifier、Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が d 文字から d1 文字に、 それぞれ変更されています。
エスケープシーケンスの補足と疑問
2007年05月29日
ISO9660 その7 PVD
Primary Volume Descriptor (PVD)(基本ボリューム記述子)の構造は、次のとおりです。
文字を入れる System identifier、Volume Identifier、 Volume Set Identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier、 Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier は全て先詰で、 余った部分には半角スペース (0x20) を入れます。 使わない場合は全て半角スペース (0x20) です。
ただ、中には最後のバイトが 0 であったり、余った部分が 0 であるディスクもあったような気がします。
Volume Set Size と Volume Sequence Number は、 例えばCD-ROM何枚組の百科辞典があるとき、 辞典のディスク枚数を Volume Set Size に、そのディスク番号を Volume Sequence Number に それぞれ入れます。ただ複数枚組のゲームでも使われているのを見たことは無く、 どちらも大抵 0x01 が入っています。
Path Table Size はパステーブルの先端から終端までのバイト数です。 パステーブルでは一つのパステーブルレコードが論理ブロックを跨いでも大丈夫です。
任意パステーブルを使わない場合 Location of Occurrence of Type L/M Path Table に 0 を入れます。
Directory Record for Root Directory には、 ルートディレクトリのディレクトリレコード(後述)が丸ごと入っています。 ディレクトリ識別子は 0x00 で、識別子の長さは 1 バイトです。
Volume Set Identifier には、例えばCD-ROM何枚組の百科辞典があるとき、 その百科辞典名を入れます。 ただ使われているのを見たことはあまり無く、 ボリュームラベルと同じか、半角スペース(0x20)で埋まっています。NOT_SET と書かれるソフトもあったような気がします。
Publisher Identifier、Data Preparer Identifier、Application Identifier が使われる場合で、 最初のバイトがアンダーバー (0x5F '_') のとき、ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。 その場合、ディレクトリレコードのファイル記述子と同じ構造です。他、普通の文字列が入っている場合もあります。
Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が使われるとき、 ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。
作成、更新、失効、発行日時の構造(datetime_l)は、次のとおりです。
年月日時分秒1/100秒は、数値ではなくd文字です。1月の場合'0x30''0x31'、12月の場合'0x31''0x32'となります。偏差のみ数値です。 偏差は、日本の場合 0x24=36=9×4 になります。
使われていない場合、年月日時分秒1/100秒にd文字の 0 (0x30) 、偏差に数値の 0x00 がそれぞれ入っています。 たまに全て数値の 0x00 になっているディスクもあります。
なお、西暦1万年問題があります。
Application Use や 最後の Reserved には、プロテクトがかけられたディスクなどで 何かしらの文字などが入っている場合があります。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Volume Descriptor Type | =1 |
| 1〜5 | 5 | char[5] | Standard Identifier | ="CD001" |
| 6 | 1 | unsigned char | Volume Descriptor Version | 大抵 =1 |
| 7 | 1 | unsigned char | Unused Field | =0 |
| 8〜39 | 32 | char[32] | System identifier | システム識別子 (a文字) |
| 40〜71 | 32 | char[32] | Volume Identifier | ボリュームラベル (d文字) |
| 72〜79 | 8 | char[8] | Unused Field | =0 |
| 80〜83 | 4 | unsigned long | Volume Space Size | ボリュームの大きさ [Blocks] |
| 84〜87 | 4 | unsigned long (M) | Volume Space Size | 上に同じ |
| 88〜119 | 32 | char[32] | Escape Sequences | =0 |
| 120〜121 | 2 | unsigned short | Volume Set Size | ボリューム集合の大きさ |
| 122〜123 | 2 | unsigned short (M) | Volume Set Size | 上に同じ |
| 124〜125 | 2 | unsigned short | Volume Sequence Number | ボリューム順序番号 |
| 126〜127 | 2 | unsigned short (M) | Volume Sequence Number | 上に同じ |
| 128〜129 | 2 | unsigned short | Logical Block Size | 論理ブロックの大きさ [BYTE] 大抵2048 |
| 130〜131 | 2 | unsigned short (M) | Logical Block Size | 上に同じ |
| 132〜135 | 4 | unsigned long | Path Table Size | パステーブルの大きさ [BYTE] |
| 136〜139 | 4 | unsigned long (M) | Path Table Size | 上に同じ |
| 140〜143 | 4 | unsigned long | Location of Occurrence of Type L Path Table | L形パステーブルの先頭位置 [LBN] |
| 144〜147 | 4 | unsigned long | Location of Optional Occurrence of Type L Path Table | 任意L形パステーブルの先頭位置 [LBN] |
| 148〜151 | 4 | unsigned long (M) | Location of Occurrence of Type M Path Table | M形パステーブルの先頭位置 [LBN] |
| 152〜155 | 4 | unsigned long (M) | Location of Optional Occurrence of Type M Path Table | 任意M形パステーブルの先頭位置 [LBN] |
| 156〜189 | 34 | struct directory_record | Directory Record for Root Directory | ルートディレクトリのディレクトリレコード |
| 190〜317 | 128 | char[128] | Volume Set Identifier | ボリューム集合識別子 (d文字) |
| 318〜445 | 128 | char[128] | Publisher Identifier | 出版者識別子 (a文字) |
| 446〜573 | 128 | char[128] | Data Preparer Identifier | データ編集者識別子 (a文字) |
| 504〜701 | 128 | char[128] | Application Identifier | 応用システム識別子 (a文字) |
| 702〜738 | 37 | char[37] | Copyright File Identifier | 著作権ファイル識別子 (d文字) |
| 739〜775 | 37 | char[37] | Abstract File Identifier | 抄録ファイル識別子 (d文字) |
| 776〜812 | 37 | char[37] | Bibliographic File Identifier | 書誌ファイル識別子 (d文字) |
| 813〜829 | 17 | struct datetime_l | Volume Creation Date and Time | ボリューム作成日時 |
| 830〜846 | 17 | struct datetime_l | Volume Modification Date and Time | ボリューム更新日時 |
| 847〜863 | 17 | struct datetime_l | Volume Expiration Date and Time | ボリューム失効日時 |
| 864〜880 | 17 | struct datetime_l | Volume Effective Date and Time | ボリューム発効日時 |
| 881 | 1 | unsigned char | File Structure Version | ファイル構造版数 =1 |
| 882 | 1 | unsigned char | Reserved | =0 |
| 883〜1394 | 512 | unsigned char[512] | Application Use | =0 |
| 1395〜2047 | 653 | unsigned char[653] | Reserved | =0 |
文字を入れる System identifier、Volume Identifier、 Volume Set Identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier、 Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier は全て先詰で、 余った部分には半角スペース (0x20) を入れます。 使わない場合は全て半角スペース (0x20) です。
ただ、中には最後のバイトが 0 であったり、余った部分が 0 であるディスクもあったような気がします。
Volume Set Size と Volume Sequence Number は、 例えばCD-ROM何枚組の百科辞典があるとき、 辞典のディスク枚数を Volume Set Size に、そのディスク番号を Volume Sequence Number に それぞれ入れます。ただ複数枚組のゲームでも使われているのを見たことは無く、 どちらも大抵 0x01 が入っています。
Path Table Size はパステーブルの先端から終端までのバイト数です。 パステーブルでは一つのパステーブルレコードが論理ブロックを跨いでも大丈夫です。
任意パステーブルを使わない場合 Location of Occurrence of Type L/M Path Table に 0 を入れます。
Directory Record for Root Directory には、 ルートディレクトリのディレクトリレコード(後述)が丸ごと入っています。 ディレクトリ識別子は 0x00 で、識別子の長さは 1 バイトです。
Volume Set Identifier には、例えばCD-ROM何枚組の百科辞典があるとき、 その百科辞典名を入れます。 ただ使われているのを見たことはあまり無く、 ボリュームラベルと同じか、半角スペース(0x20)で埋まっています。NOT_SET と書かれるソフトもあったような気がします。
Publisher Identifier、Data Preparer Identifier、Application Identifier が使われる場合で、 最初のバイトがアンダーバー (0x5F '_') のとき、ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。 その場合、ディレクトリレコードのファイル記述子と同じ構造です。他、普通の文字列が入っている場合もあります。
Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が使われるとき、 ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。
作成、更新、失効、発行日時の構造(datetime_l)は、次のとおりです。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 4 | char[4] | Year from 1 to 9999 | 西暦年 (d文字) |
| 4 | 2 | char[2] | Month of the year from 1 to 12 | 月 (d文字) |
| 6 | 2 | char[2] | Day of the month from 1 to 31 | 日 (d文字) |
| 8 | 2 | char[2] | Hour of the day from 0 to 23 | 時 (d文字) |
| 10 | 2 | char[2] | Minute of the hour from 0 to 59 | 分 (d文字) |
| 12 | 2 | char[2] | Second of the minute from 0 to 59 | 秒 (d文字) |
| 14 | 2 | char[2] | Hundredths of a second | 1/100 秒 (d文字) |
| 16 | 1 | char | Offset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) | グリニッジ標準時からの偏差(15分単位) |
年月日時分秒1/100秒は、数値ではなくd文字です。1月の場合'0x30''0x31'、12月の場合'0x31''0x32'となります。偏差のみ数値です。 偏差は、日本の場合 0x24=36=9×4 になります。
使われていない場合、年月日時分秒1/100秒にd文字の 0 (0x30) 、偏差に数値の 0x00 がそれぞれ入っています。 たまに全て数値の 0x00 になっているディスクもあります。
なお、西暦1万年問題があります。
Application Use や 最後の Reserved には、プロテクトがかけられたディスクなどで 何かしらの文字などが入っている場合があります。
2007年05月27日
ISO9660 その6 ボリューム記述子
ボリューム記述子群は、読み取りのスタート地点であり、
トラックの先頭より16論理セクタ目から始まり、数論理セクタ続きます。
この中に、ボリューム、ファイルシステムの情報が書かれています。
個々のボリューム記述子の大きさは1論理セクタです。
ボリューム記述子には、次の種類があります。
ボリューム記述子群は、最低2論理セクタ続きます。
16 PVD
17 VDT
です。
多くの windows 用 CD-ROM では、
16 PVD
17 SVD
18 VDT
となっています。この場合、PVD用のパステーブルとディレクトリ群とは別に、 SVD用のパステーブルとディレクトリ群があります。ファイル本体は共通です。
拡張ボリューム記述子(EVD)は、ISO9660:1999 から加えられた仕様です。
個々のボリューム記述子は、次のようになっています。
この中に、ボリューム、ファイルシステムの情報が書かれています。
個々のボリューム記述子の大きさは1論理セクタです。
ボリューム記述子には、次の種類があります。
| 番号 | 名称 | 適当訳 | 備考 |
| 0 | Boot Record | 起動レコード | |
| 1 | Primary Volume Descriptor (PVD) | 基本ボリューム記述子 | 本当は厳密なISO9660用 |
| 2 | Supplementary Volume Descriptor (SVD) Enhanced Volume Descriptor (EVD) | 副ボリューム記述子 拡張ボリューム記述子 | 文字種、文字数などの制限を緩めたい場合 joliet など |
| 3 | Volume Partition Descriptor | ボリューム区画記述子 | |
| 255 | Volume Descriptor Set Terminator (VDT) | ボリューム記述子集合終端子 | ボリューム記述子群の最後を示す |
ボリューム記述子群は、最低2論理セクタ続きます。
16 PVD
17 VDT
です。
多くの windows 用 CD-ROM では、
16 PVD
17 SVD
18 VDT
となっています。この場合、PVD用のパステーブルとディレクトリ群とは別に、 SVD用のパステーブルとディレクトリ群があります。ファイル本体は共通です。
拡張ボリューム記述子(EVD)は、ISO9660:1999 から加えられた仕様です。
個々のボリューム記述子は、次のようになっています。
| 位置 | 大きさ | 型 | 名称 | 内容 |
| 0 | 1 | unsigned char | Volume Descriptor Type | ボリューム記述子の種類 |
| 1〜5 | 5 | char[5] | Standard Identifier | ="CD001" |
| 6 | 1 | unsigned char | Volume Descriptor Version | バージョン |
| 7〜2047 | 2041 | - | - | ボリューム記述子の種類によって異なる |

