作者: 機械伯爵
日時: 2003/12/16(17:23)
 え〜御題。

 クリスマスシーズンということで、びっくり箱的にス
クリプトを動かすとクリスマスカードが生成されるとゆー
プログラムを考えていて、その延長で、バイナリファイ
ルをスクリプトに埋め込む方法を考えてみました。

 Pythonでフツーに書くとこんな風になります。

#---bin2txt.py---<begin>

import sys, re
in_file = sys.argv[1]
out_file = re.sub(r"\.","_",in_file) + ".py"
f = open(in_file, "rb")
r = f.read()
s = repr(r) # バイナリデータを文字表現で出力
k = "open('" + in_file + "','wb').write(" + s + ")"
open(out_file,"w").write(k)

#---bin2txt.py---<end>

 ステップとしては・・・

・バイナリデータをファイルから読み込む
・String(バイナリのシーケンス) を repr で表示させる
  ことで、文字列に変換
・Pythonスクリプトを付け加えてファイルに収納

 といった感じです。

 変数を減らすと、こんな風、かな?

#---bin2txt2.py---<begin>

import sys, re
f_n = sys.argv[1] # f_n .. file name
open(
  re.sub(r"\.","_",f_n) +".py","w"
).write(
  "open('" + f_n +
  "','wb').write(" +
  repr(open(f_n, "rb").read()) + ")")

#---bin2txt2.py---<end>

 sys.argv[1] を何度も書けば、変数は減らせますが、
さすがに読むのも書くのも辛いので、残しました。

 ここらへんの処理は、Perl や Ruby は強そうなのです
が、どうでしょうか?

※awk はさすがに、バイナリは使えない筈だと思ったけ
  ど・・・sedとかどうかな?

/機械伯爵/

※Python版も、もうちっとマシなのがあればお願いします。
 ・・・あ、圧縮かける手があったか(汗)