uicaのデータフォーマットは、ソニーの非接触ICカード技術「FeliCa(フェリカ)」をベースに、鉄道独自の「サイバネ規格」というルールでデータが配置されています。
利用履歴のデータ構造(1ブロック16バイト)
Suicaの履歴は1件につき16バイトの固定長で記録されています。主なデータの配置は以下の通りです。
| バイト位置 | 内容 | 詳細説明 |
| 0 | 機器種別 | 0x05: 改札機、0x08: 券売機、0xc7: 物販端末 など |
| 1 | 利用種別 | 0x01: 運賃支払、0x02: チャージ、0x0f: バス利用 など |
| 2-3 | 決済種別 | 支払い方法などの詳細(通常は0x00) |
| 4-5 | 日付 | 7bit(年) + 4bit(月) + 5bit(日) の形式(年は2000年起算) |
| 6-9 | 入線/出線駅 | 入場駅と出場駅のコード(各2バイトずつ) |
| 10-11 | 残高 | リトルエンディアン形式(逆順で読み取りが必要) |
| 12-14 | 履歴連番 | 0から順にカウントアップされる通し番号 |
| 15 | リージョン | 地域コード |
日付データの変換例
日付は16ビット(2バイト)で管理されており、単純な数値ではなくビット演算が必要です。
- 計算式:
年 = (data >> 9) + 2000/月 = (data >> 5) & 0x0f/日 = data & 0x1f
残高データの変換例
残高は10〜11バイト目に格納されていますが、リトルエンディアン(下位バイトが先)である点に注意してください。
- 例:
0x50 0x12と並んでいる場合、0x1250と読み替え、10進数に直すと「4,688円」となります。
システム全体の階層構造
FeliCaの仕様により、データはフォルダのような階層構造で管理されています。
- システムコード (
System Code): Suicaの場合は通常0x0003。 - エリア (
Area): データの分類。 - サービスコード (
Service Code): 読み取りたい情報の種類。090f: 利用履歴(読み取り専用)008b: 属性情報(残高など)
データを読み取る際の注意点
- 駅コードの解析: 6〜9バイト目に含まれる駅コードは、単なる数字の羅列です。これを「新宿」「梅田」などの名前に変換するには、有志が公開している「駅コード変換テーブル(サイバネ駅コード)」を参照する必要があります。
- 物販の詳細は不明: コンビニ等で利用した履歴(物販)の場合、駅コードの場所に店舗コードが入りますが、店舗名までの詳細はカード内のデータだけでは判別できないことがほとんどです。




コメント