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 件のコメント:
コメントを投稿