12cmCD(EPWING)と、電子ブック(EB)のデータ構造について 田中二郎 註)本文中「EB?」と前置きしている部分は電子ブックの場合です。 BYTE:8ビットデータ WORD:上位BYTE+下位BYTE LONG:上位WORD+下位WORD PTR :(上位WORD+下位WORD−1)*2048+オフセットWORD BCD :上位WORD+中位WORD+下位WORD をBCDで解釈 BCDP:(上位WORD+下位WORD−1)*2048+オフセットWORD、ただし各語はBCD ---------------------------------------------------------------------------- ★カタログ(EB?"/CATALOG":"/CATALOGS") WORD count; BYTE unknown[14]; struct { BYTE unknown; BYTE unknown; WORD name[EB?15:40]; // 内容 BYTE dir[8]; // ディレクトリ名 BYTE unknown[EB?2:76]; } entry[count]; ★データ(EB?"/dir/START":"/dir/DATA/HONMON") // dir はカタログより得る ◇第1ページ(註:nページとは、(n-1)*2048 バイト目から始まる) WORD count; BYTE unknown[14]; struct { BYTE index; // 下記参照 BYTE unknown; LONG start; // 開始ページ番号 LONG length; // ページ数 BYTE unknown[6]; } index[count]; index: 内容 00: 本文 01: メニュー 02: 著作権表示 03: 条件検索見出し 04: 前方一致(かな)見出し 05: 前方一致見出し 06: 後方一致(かな)見出し 07: 後方一致見出し 08: 前方一致(英字)見出し 09: 後方一致(英字)見出し 0A: 条件検索(その他)見出し 0B: 分類番号見出し 0F: * 図版一覧 30: * かなインデックス 60: * 表記インデックス 70: 後方一致(かな)インデックス 71: 後方一致インデックス 72: 後方一致(英字)インデックス 73-7F: 後方一致(その他)インデックス 80: 条件検索インデックス 81-8F: 条件検索(その他)インデックス 90: 前方一致(かな)インデックス 91: 前方一致インデックス 92: 前方一致(英字)インデックス 93-9F: 前方一致(その他)インデックス A0: 分類番号インデックス D0: * 音声/図データ D1: * 図版データ F1: * 外字(全角16) F2: * 外字(全角24) F3: * 外字(半角16) F4: * 外字(半角16) FF: * 複合検索インデックス ◇インデックス 各ページの先頭の1バイトにより、構造が異なる ・先頭が 00,20,40,60 の場合(固定長) BYTE id; /* 00, 20, 40, 60 */ BYTE length; WORD count; struct { // 昇順に並んでいる BYTE keyword[length]; // 同じものもあり得る? LONG nextpage; } key[count]; ・先頭が 80,A0,C0,E0 の場合 BYTE id; /* 80, A0, C0,E0 */ BYTE dummy; WORD count; struct { BYTE length; BYTE keyword[length]; // 見出し語 PTR honmon; // 本文へのポインタ PTR list; // 見出し一覧へのポインタ } key[count]; ・先頭が 90,B0,D0 の場合 BYTE id; /* 90, B0, D0 */ BYTE dummy; WORD count; 以下の構造体(1)(2)(3)が countヶ並ぶ。 (1) struct { BYTE 0x00; BYTE length; BYTE keyword[length]; // 見出し語 PTR honmon; // 本文へのポインタ PTR list; // 見出し一覧へのポインタ } (2) struct { BYTE 0x80; BYTE length; WORD num; BYTE keyword[length]; // 代表的な読み? } trail; この構造体には、次の構造体が numヶ続く。 (このページ内に収まらない時は、次ページに…) (3) struct { BYTE 0xC0; BYTE length; BYTE keyword[length]; // 見出し語 PTR honmon; // 本文へのポインタ PTR list; // 見出し一覧へのポインタ } pattern; ◇本文 タグ+引数のワード数:内容 -------------------------- 1f02: 項目 1f03: 終了(ここで表示は停止するべき?) 1f04: 半角 1f05: 終了 1f06: 下付 1f07: 終了 1f0e: 上付 1f0f: 終了 1f10: 斜字 1f11: 終了 1f12: ボールド 1f13: 終了 1fe0+1: 文字属性?(平凡社大百科、リーダース英和辞典では+1が無い) 1fe1: 終了 1fe2: 字体? 1fe3: 終了 1fe4+1: 字体指定? 1fe5: 終了 1f0a: 改行(項目の終りだったりする) 1f09+1: 段下指定(指定値が1(段下なし)だと、項目の終りかもしれない) 1f41+1: ?(角川類語新辞典で指定値が01a0だと、項目の終り) 1f61: 1f4d+1: 以後、指定値数ぶん、文字がキーワードである? 1f6d: 終り 1f49+3: 表(1文字+横+縦が指定される) 1f43: リンク開始 1f4a: リンク開始 1f4e: リンク開始 1f4f: リンク開始 1f32+2: 図ポインタ(横+縦。+2が無いこともある?) 1f51+3: ポインタ(BCDP形式) 1f52+3: ポインタ(BCDP形式) 1f62+3: ポインタ(BCDP形式) 1f63+3: ポインタ(BCDP形式) 1f64+3: ポインタ(BCDP形式) 1f69+3: ポインタ(BCDP形式) 1f6a+3: ポインタ(BCDP形式) 1f6b+3: ポインタ(BCDP形式) 1f6c+3: ポインタ(BCDP形式) 1f6e+3: ポインタ(BCDP形式) 1f6f+3: ポインタ(BCDP形式) 1f44+6: 図形枠(BCD横+BCD縦。平凡社大百科では、さらにBCD深さ?) 1f48+5: 音声(?+?+BCDP形式ポインタ) 1f68: 終了 1f4b+5: 図形枠(?+横+縦+?+?) 1f4c+5: 図形枠(?+横+縦+?+?) 1f31: 1f45: 図版 1f65: 1f42: 1e02: ? 1e01: ? 1e22: ? 1e20: ? 1e21: ? 1e24: ? 1e30: ? 1e31: ?