2013年5月8日水曜日

明日のためのメモ pythonでバイナリ

pythonを使ってバイナリデータ(長さ不定のヘッダあり)を変数に読み込み特定の文字ごとに区切ってリストに入れて、区切られた要素はときどき要素数が一定でないのに対応して任意のパターンでアンパックしたいときの処理がしたいなー( ´・ω・`) というときに使えそうなプログラムのメモ

こんなバイナリ入力→「****123*****123*****123**123***」

を↓こんな感じで出力、output[]の中身を一行ずつCSVに入れたりすると幸せになれるかもしれない。

output=[[aaaa],[123,100,200],[123,20,30],[123,34,12,12],[123,0,2]]

関数にしてみた↓ conは入力(バイナリ)

def binparse(con):
    con=con.replace('123','\n123')
    con=con.split('\n')
    print "replaced\n",con
    cnt=0
    for i in con:
        if 1<cnt<(len(con)) and i[0:2] !='ab':  ←配列の修正。区切り文字が意図しないところにはいっていてもこれでたぶん修正できる。
            con[cnt-1]=con[cnt-1]+"\n"+i
            con.pop(cnt)
       
        cnt += 1

    out=[]
    cnt=0
  
    fmt1='2c6hi'  ←文字数ごとに適当なフォーマットを設定。パターンが増えそうだとインデックス
    fmt2='2c3hc'   とかリストにまとめたほうがいいかも
    for i in con:
        l=len(i)
        if l==20: ←長さが20だったら~fmt以外は同じ処理
            tmp=struct.unpack(fmt1,i)
            tmp2=[]
            for j in range(len(tmp)):
                           
                tmp2.append(tmp[j])
            print out
            out.append(tmp2)
        elif l==9:
            tmp=struct.unpack(fmt2,i)
            tmp2=[]
            for j in range(len(tmp)):
                           
                tmp2.append(tmp[j])
            print out
            out.append(tmp2)
            pass
        cnt += 1
   
    f.close()
    return out

0 件のコメント:

コメントを投稿