Show page source of suica #14591

= 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停留所コードテーブルを見れば良い。