= Suica 以下の情報は、でんのすけさんにいただいた情報、および guisaの実装(page3.nifty.com/slokar/pasori/gsuica)をベースにしています。 Suica/ICOCA/PiTaPa/PASMO/TOICA は基本的に同じフォーマットです。 Suica には入出場記録と履歴の2つのサービスコードがある。以下の説明は履歴のほうのみ。サービスコードは 0x090f。 (なお、IruCa はシステムコードが 0xde80 に変わるが、フォーマットは基本的に Suica 系と同じ) 各エントリは16バイト。フォーマットは以下の通り。 * 0: 端末種 * 1: 処理 * 2-3: ?? * 4-5: 日付 (先頭から7ビットが年、4ビットが月、残り5ビットが日) * 6 : 入線区 * 7 : 入駅順 * 8 : 出線区 * 9 : 出駅順 * 10-11: 残高 (little endian) * 12-14: 連番 * 15: リージョン 残高だけ little endian なので注意。 なお、物販とバスの場合、以下のようにフォーマットが変わる。 * 物販 : 6-7バイト目が時刻となる。先頭から5ビットが時,6ビットが分,下5ビットは不明(秒にしてはビット数が足りない?) * 物販とは処理の値が 70, 73, 74, 75, 198, 203 のときである。 * バス : 入線区/入駅順がなくなり、出線区/出駅順が各16ビットになる(それぞれ 6-7, 8-9バイト目) * バスとは、処理の値が 13, 15, 31, 35 のときである。 端末種の値は以下の通り * 3 : 精算機 * 4 : 携帯型端末 * 5 : 車載端末 * 7 : 券売機 * 8 : 券売機 * 9 : 入金機 * 18 : 券売機 * 20 : 券売機等 * 21 : 券売機等 * 22 : 改札機 * 23 : 簡易改札機 * 24,25 : 窓口端末 * 26 : 改札端末 * 27 : 携帯電話 * 28 : 乗継精算機 * 29 : 連絡改札機 * 31 : 簡易入金機 * 70 : VIEW ALTTE * 72 : VIEW ALTTE * 199 : 物販端末 * 200 : 自販機 処理の値は以下の通り * 1 : 運賃支払(改札出場) * 2 : チャージ * 3 : 券購(磁気券購入) * 4 : 精算 * 5 : 精算 (入場精算) * 6 : 窓出 (改札窓口処理) * 7 : 新規 (新規発行) * 8 : 控除 (窓口控除) * 13 : バス (PiTaPa系) * 15 : バス (IruCa系) * 17 : 再発 (再発行処理) * 19 : 支払 (新幹線利用) * 20 : 入A (入場時オートチャージ) * 21 : 出A (出場時オートチャージ) * 31 : 入金 (バスチャージ) * 35 : 券購 (バス路面電車企画券購入) * 70 : 物販 * 72 : 特典 (特典チャージ) * 73 : 入金 (レジ入金) * 74 : 物販取消 * 75 : 入物 (入場物販) * 198 : 物現 (現金併用物販) * 203 : 入物 (入場現金併用物販) * 132 : 精算 (他社精算) * 133 : 精算 (他社入場精算) == 駅コード/店舗コード http://www.denno.net/SFCardFan/ にあるサイバネ駅コードデータベースで調べられる。 === 駅名 端末種が 0xc7, 0xc8, 0x05 以外の場合。 駅名については地区コード(AreaCode)、線区コード(LineCode)、駅順コード(StationCode)から調べる。 ここで、地区コードは以下のように求める。 * 線区が 0x7f 以下のとり : 0 (JR線) * 線区が 0x80 以上でリージョンが 0 のとき : 1 (関東公営・私鉄) * 線区が 0x80 以上でリージョンが 1 のとき : 2 (関西公営・私鉄) === 店舗名 端末種が 0xc7, 0xc8 の場合。 店舗については、エリア(AreaCode)、端末(TerminalCode)、線区(LineCode)、駅順(StationCode)の4バイトで検索する。 エリアコードは 1:Suica/PASMO, 2:ICOCA, 4:IruCa となっている。しかし、履歴にはエリアコードは記録されておらず、 さらに Suica/PASMO 間でコード重複があるので、100% 確実に店舗名を知ることは不可能。 === 車載端末(バス) 端末種が 0x05 の場合。 このときは、線区/駅順をキーに IruCa停留所コードテーブルを見れば良い。