Binaryファイルの解析

本ページでは、Binaryファイルの構造を解析し、読み込むpythonプログラムの作成手順を開設します。

 入力ファイルとして、binaryファイルと、それに対応した textファイル(測定装置付属のプログラムでexportなどしたもの) が 
あることを前提にします。

 入力データがx,yだけでない場合、例えばTFTのデータVds, Vgs, Ids, Igs等のような場合は、下記のx,yデータの解析を適切な変数数に読み替えてください。


一般的な解析手順

  1. Binaryファイルと、対応するTextファイルを用意する
  2. Binaryファイルのファイルサイズ bin_file_size を確認する
  3. テキストファイルからデータ数 ndata を取得する
  4. Binaryファイルを Binaryエディタ (16進エディタ) で読み込み、データ部を推測します。
    ヘッダー部は 0 が多かったり、不規則な16進数が続いているのに対し、
    データ部は、4 ~ 32 bytes 毎に規則的な16進数が続くので、ほとんどの場合に容易に判断できると思います。
    * Binaryエディタとしては、Visual Studio CodeのHex Edit拡張機能を推奨します
     
  5. データ部が判断できた場合はそのサイズ、相でない場合はBinaryファイルサイズbin_file_size を使い、
    ndata からデータ1セットあたりのbyte数 floor(bin_file_size / ndata) を推測する。
    *ヘッダー部+フッター部がデータ部に対して極端に大きくない限り、正確な数値が出ます。
     できるだけ、ndata の大きいファイルを使ってください
     
  6. データ部が特定できた場合、データの変数型を特定する。
    Binaryエディタの一部 (HexEdit拡張機能など)は、バイナリ部をクリックすると、可能性のある型に対応する値を表示してくれます。
    このさい、little endianかbig endianかを正しく選ぶ必要がありますが、最近のCPUはほぼすべてがlittle endianです。
    表示された数値が、テキストファイルのデータ数値と一致するか(丸め誤差を考慮する必要あり)で、変数型を特的できます。
    数値データの型としては、以下の優先順位で特定できると思います。
     優先順位: float32, float64, float16, int32, int16, uint32, uint16, int8, uint8
    *多くの場合、float32だと思います。
    *2 byte データ (float16やint16など) で (x,y) が保存されるケースが無いとは言えない(ADコンバータや機械学習データなど) ので注意が必要です。
    *実数データがdouble (8 byte) で保存されることもあるかもしれません。メーカー製のプログラムはファイルサイズなども最適化されているでしょうし、過去の16 ~ 32 bit PCのファイルとの互換性も維持していれば、このケースは少ないと思います。
    *いずれでもない場合、IEEE754定義でない、昔の浮動小数点フォーマットである可能性があります。
     この場合は、プログラムを作成した時期 (特に x87系浮動小数点コプロセッサを使っていた場合)、OS、プログラムファイルのメタデータからコンパイラを特定する必要がありますが、
    たいていの場合はMicrosoft Visual C+++ / Basic、Borland C++/Delphi, 古い g77, gcc, gpp, その他Forran/C++コンパイラ (Watcom、Pro Fortranなど複数あり) だと思いますが、これらもIEEE754書式をサポートしていたものも多いようです。。
     
  7. データ型から、データのセットが(x,y)データの組になっているか、yデータだけになっているかを推測する。
  8. データのセットがyデータだけの場合、xデータはメタデータから start, step 値をとりだし、計算する
     
  9. Binaryファイルのヘッダー部、フッター部からメタデータの位置 (offset) を特定します。
    テキストファイルからメタデータの値を読み取り、丸め誤差を考慮したうえで同一の値を検索します。
    Binaryエディタで表示される数値から解析するか、次の章で説明するプログラムでスキャンします。

以上の情報から各データのoffset値が得られれば、Binaryファイルの読み込みプログラムを作れます。
例えば、各データについて

を整理し、それぞれをbinaryデータ読み込み関数を作って読み込みます。


pythonプログラムを使った解析例

 「一般的な解析手順」のうち、8.のメタデータのoffsetの決定を行うプログラムを使った例です。
  1. Binaryファイルと、対応するTextファイルを用意する
  2. 「一般的な解析手順」の手順により、endian、データ部のoffset、データが(x,y)のペアかyデータだけか、それらの変数型を解析する
  3. 解析プログラムを analyze_BRUKER.py を修正して作成。この際、以下のパラメータを更新する。
    bin_file = 'test.raw'    # Binaryファイル名
    text_file = 'test.txt'    # テキストにexportしたファイルのファイル名
    eps = 0.001       # 浮動小数点データの許容誤差
    endian = 'little'   # endian。多くの場合はlittle
    data_offset = 0xc56 + 16 # データ部のオフセット + データ2セット分のバイト数 (大きい分にはOK)
  4. analyze_BRUKER.py を実行。
    解析する変数を追加する場合は、
     parse_text_file()

     append_data(metadata, varname, 'float32', value, eps)
    のように追加。
  5. 最後に
     vars_inf
    が出力される。
  6. read_BRUKER.pyを参考に、Binaryファイル読み込みプログラムを作成し、動作確認を行う
    (i) vars.inf を置き換える
    (ii) vars_inf の要素のうち、不要のものを削除 (コメントアウト)
    (iii) read_bin_file()を編集し、vas_bin, x_list, y_listを返すようにする。

参考: 生成AIによる解析(失敗)

 生成AIにBinaryファイルのテキスト化データ (Base64、16進ダンプ) と、exportしたテキストデータを与えて解析しようとしたが、
以下の状況で断念
  1. 生成AI (Chat GPT5, Gemini 2.5 Flash/Pro) はBase64を正常にデコードできない
  2. 16進ダンプでは問題ない
  3. しかし、Binaryファイル中のoffsetは数えられない。
    結局はプログラムを作り、Binaryファイルをスキャンしてoffsetを調べる必要がある。
  4. 解析手順を与えてデータ数、データサイズ、変数型等を解析させたが、特に変数型などは仮定(決め打ち)している