はじめに
この投稿は「とりあえずなんでも Advent Calendar 2019」の4日目の記事です。
フィットネスデバイスなどで使用されているFITファイルのうち、ファイルシステムに正常にファイナライズされなかったデータを、デバイスから引き抜いてみたときのメモです。
起きたこと
自分は自転車の走行ログを機器で取っているのですが、ある日、走行中に電池が切れてしまい、該当のFITファイルのデータサイズ0byteになっていました。
その日はそこそこ走っており、データが消えるのは惜しいと思ったのでデータ復旧を模索してみました。
自分の環境と前提条件
デバイス:Lezyne MICRO C GPS
バイナリエディタ(HxD):Version 2.3.0.0 (x86-64)
PC: Windows10 Pro
RAM16GB
前提として、HxD等のディスクの中身を見ることができるバイナリエディタが必要です。
あまり詳しくないのですが、この方法はファイルシステム依存で、分割書きがされる場合等は使えないと思います。(セクターごとに連続で書き込まれる単純な構造だったのでOKだった)
メモリ上にデータが残っていない場合、当然ながらこの方法は使えません。
手順
FITファイルのファイルフォーマットを知る
こちらの記事がわかりやすく解説されているので、参考にします。以下、参考記事とします。
ファイルが特定できるに必ず入っているデータを特定する
データ列から、1ファイルに必ず1つ入っているデータを探します。
参考記事のファイルフォーマット解説、特にHeaderの部分を見ます。今回はData Type Byteの4byteとData Sizeの4byte,計8byteを見ればなんとかなりそうです。
Data Type Byte[0] ASCII文字コードで".FIT"を格納する。
つまりData Type Byte[0]から順に{0x2E, 0x46, 0x49, 0x54}を格納します。
Data Size LSB Headerとファイル終端のCRCを除いたデータのサイズ。
該当ファイルデータをデバイスから探す
デバイスのメモリの中身を見て、ファイルデータを探します。
まずはHxDでデバイスのメモリの中身を見ていきます。
ツールから、ディスクを開くを選択して、自分のデバイスを選択します。
この時、デバイスを壊してしまわないよう、読み取り専用で開いておきます。
開いた後、先ほどのData Type Byteを検索して、まずはすべてのファイルデータを洗い出しましょう。
こんな感じで検索結果が出ると思います。
ここから、抜き取りたいデータがどれなのかを探していきます。
今回は、この381608D7.fitが目的のファイルなのですが、実際このファイルがどれなのかをバイナリで見ることができないので、この前後のファイルを見ていきます。今回は前二つを見ます。
前のファイルをバイナリエディタで開いて、Data Type Byteの4byteとData Sizeの4byte,計8byteを確認します。
この確認した値を開いたディスクで検索し、その場所を特定します。
この手順を2ファイル分繰り返した結果、このような結果になりました。
この赤枠で囲ったデータが、ほしいデータ列のはず、ということになります。
データを引き抜く
特定したデータ列を引っこ抜きます。引き抜き開始位置は先ほどのオフセット、サイズはData Sizeに記載されている値+16byte(HeaderとCRCのサイズ)です。今回の自分のケースだとData Sizeは0x0000E311なので0x10を足して0xE321分の領域を選択し、コピーして新規ファイルとして保存します。
CRCを計算してもらう
ここからCRCを計算するという作業が残っているのですが、それは他のサービスを使ってやってもらうことにしました。
こちらのサイトはFITファイルの中身のログを編集するサイトです。
項目を削除する「Field Stripper」を選び、先ほど保存したファイルを入力します。
削除項目は何もチェックせずGoボタンを押して、出てきたファイルをダウンロードするだけです。
本来はRecord部分を削除して、全体のCRCを計算するのですが、何も削除しなくてもCRCを計算しなおしてくれるので、便利でした。
確認
FITファイルが読めるものであるかを確認するために、stravaというサービスにFITファイルを上げてみたところ、正常に記録が読み込めました。
終わりに
普段から仕事でバイナリエディタでデータを見たり、データをダンプしたりしているので、こういうことをすることに対しての敷居が以前より下がった気がします。