いろんなものはつながっている

pythonでバイナリデータをよみこんでみる。

pythonでバイナリデータを読み込んで、元々のデータ構造に変換したい。

Cとかならキャストしまえば一発だけど、どうもpythonにはそういうものがないらしい。

structを利用するみたい。まずバイナリから変換するデータ型(intとか)を定義して、バイナリを入力して出力を得る。
データ型はintだったから’i’とか、ushortなら’H’とか。配列の場合は前に数字をつけて、’8H’。

>>> data=f.read(8*2) #バイナリデータ読み込み
>>> s=struct.Struct(‘8h’) #読み込みフォーマット作成
>>> data_unpack = s.unpack(data)
>>> print(data_unpack)
>>> (1,2,3,4,5,6,7,8)

結果はタプルで返ってくる

import numpy as np
import struct
import os

class ByteReader(object):
    def __init__(self):
        #型に応じたstructを格納
        self.struct_dict = {}
        #型のstructのフォーマットとサイズ
        self.type_format ={"int":"i", "uint":"I", "short":"h", "ushort":"H", \
                           "float":"f", "double":"d", "char":"c", "byte":"b" }               
        self.type_size ={"int":4, "uint":4, "short":2, "ushort":2, \
                           "float":4, "double":8, "char":1, "byte":1 }
    #読み込み
    def read(self, handle, count, data_type):
        #入力ハンドルチェック
        if not handle:
            return []
        #型チェック
        data_type= data_type.lower()
        if data_type not in self.type_format:
            return []
        #型変換のためのstructがあるか。なかったら作成する
        format_code = self.type_format[data_type]
        struct_arg = str(count) + format_code
        if struct_arg not in self.struct_dict:
            self.struct_dict[struct_arg] = struct.Struct(struct_arg)
        #バイナリを読み込んで型変換
        read_size = int(self.type_size[data_type]) * count
        binary_data = handle.read(read_size)
        s = self.struct_dict[struct_arg]
        convert_date = s.unpack(binary_data)

        return list(convert_date)
   
if __name__ == '__main__':
    #ファイルオープン
    binary_file_path=r"C:\AAA.bin"
    f=open(binary_file_path, "rb")
    #先頭をスキップ
    f.seek(64, os.SEEK_SET)
    #データ読み込み
    br=ByteReader()
    #ID
    item_id=br.read(f, 1, 'int')
    print(item_id)
    #時間
    item_date=br.read(f, 8, 'short')
    print(item_date)
    #...
    f.close()
   

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク