【調査】Suicaデータフォーマット

ICカード・NFC

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の仕様により、データはフォルダのような階層構造で管理されています。

  1. システムコード (System Code): Suicaの場合は通常 0x0003
  2. エリア (Area): データの分類。
  3. サービスコード (Service Code): 読み取りたい情報の種類。
    • 090f: 利用履歴(読み取り専用)
    • 008b: 属性情報(残高など)

データを読み取る際の注意点

  • 駅コードの解析: 6〜9バイト目に含まれる駅コードは、単なる数字の羅列です。これを「新宿」「梅田」などの名前に変換するには、有志が公開している「駅コード変換テーブル(サイバネ駅コード)」を参照する必要があります。
  • 物販の詳細は不明: コンビニ等で利用した履歴(物販)の場合、駅コードの場所に店舗コードが入りますが、店舗名までの詳細はカード内のデータだけでは判別できないことがほとんどです。

コメント