Suicaの利用履歴データ仕様(年月日と残額)

Suicafelicalibで読み取ると、要素数16のint型配列としてデータを取得できるのだが、
年月日と残額が少し変わった方法で格納されているのでメモ。

はじめに

Python: PaSoRiSuicaの履歴を読み出す・その後
http://handasse.blogspot.com/2008/04/python-pasorisuica.html


PythonSuicaの履歴を取得するプログラムのソースが公開されているので、該当部分を見ていく。
年月日と残額以外のデータについてもここが参考になる。

読み取る場所

たとえば、
[8, 3, 0, 0, 11, 158, 1, 1, 0, 0, 134, 1, 0, 0, 16, 0]
という配列dataがあったとして、


data[4]=11 と、
data[5]=158 が年月日を表していて、


data[10]=134 と、
data[11]=1 が残額を表している。

実際に計算

年:data[4]を1bit右にシフトしたものに2000を足す

(例)
0d11 = 0b1011 を右にシフトして 0b1010 = 5
2000を足すと2005年

月:(data[4]と1の論理積)を左に3bitシフトしたものと、data[5]を右に5bitシフトしたものを足す

(例)
0b1011 & 0b0001 = 0b0001 これを左に3bitシフトすると 0b1000 = 0d8
data[5] = 0d158 = 0b10011110 これを右に5bitシフトすると 0b100 = 0d4
この2つを足すと8+4=12月

日:data[5]と31の論理積

(例)
data[5] = 0d158 = 0b10011110 と 0d31 = 0b011111 の論理積は 30

残額:data[11]を8bit左にシフトしたものと、data[10]を足す

(例)
data[11] = 1 を左に8bitシフトすると256
256 + 134 = 390円



という感じでいける。ソース読めば分かるんだけど一応…