WindowsMobile のアプリを Visual Studio Express で無理やり作る会に行ってきた
友人の誘いでちょっと行ってきた。
行った先はこれです。
http://d.hatena.ne.jp/n7shi/20101115
pythonでバイナリに文字列書き込み
Zip実装でお勉強中。
ヘッダー書くところの次で、ファイル名をバイナリに書き込もうとおもったけど
やりかたがなかなかわかりませんでした。
- 以下は、単純に struct.unpack の使い方です。
文字列を pack でバイナリ書き込みするときは
s で書き込みます。
ただし、H や L と違って s だけで指定だと 1 文字しかきこめません。
import struct f = open("hoge1.zip", "wb") f.write(struct.pack('<s', 'h')) f.close()
チュートリアルなどを読んだのですが、
連続する文字列を書き込む方法がよくわからなくて、
いろいろ試しました。
けっきょく、struct.pack('<5s', 'hoge.txt') のような指定でうまく行きました。
s は、単純にマルチバイト文字の文字数を表してるようなので、
len() で取得して、s をくっつけます。
さらに、s を指定するときは、リトルエンディアンの指定(<)がいらないことがわかりました。
こんなかんじ
filename = 'hoge.txt' filelens = str(len(filename)) + 's' f.write(struct.pack(filelens, filename))
とりあえず、ファイル名の書き込みまで。
次のバイナリの中身はなんだ!?
けっきょくXUbuntuにした
Xubuntuにした。
すごくハマった。
一番ハマったところは、タスクバーにアイコンを足そうとしたら
新規に追加するボタンがなくて、途方にくれたところ。
何も入力せずに、ADDすると、メニューにないアイコンが出てくる。
zipうんぬん その2
チュートリアルのを参考に、Zipの一番最初のヘッダーを抜き出して表示してみた。
ソース
import struct data = open('hoge.zip', 'rb').read() start = 0 headers = struct.unpack('<LHHHHH', data[start:start+14]) signature, needver, option, comptype, filetime, filedate = headers print 'signature',hex(signature) print 'needver', hex(needver) print 'option', hex(option) print 'comptype', hex(comptype) print 'filetime', hex(filetime) print 'filedate', hex(filedate)
結果
signature 0x4034b50 needver 0xa option 0x0 comptype 0x0 filetime 0x477 filedate 0x3d43
ん、あれっ、あと、これの逆をすればいいのか
最初のヘッダーを書くほう
import struct import datetime d = datetime.datetime.today() signature = 0x04034B50 needver = 0xa option = 0x0 comptype = 0x0 filetime = (d.year - 1980) << 9 | d.month << 5 | d.day filedate = d.hour << 11 | d.minute << 5 | d.second >> 1 f = open("hoge1.zip", "wb") f.write(struct.pack('<LHHHHH', signature, needver, option, comptype, filetime, filedate)) f.close()
Zipうんぬん
もうちょっとすすめる
http://www.python.jp/doc/2.5/tut/node13.html
このページの
11.3 バイナリデータレコードの操作
の例がZIPファイルだったので、おおっと思いながら試してみたら・・・