再直し

またまた、いろいろとご指摘を受けたり
ちょっと根本的によくわかってなかったり
おっ、なるほどというようなことがあったので、直しました。


まず、OnPaint() 内で値をいじらないという部分で
ここ以外でもう1回 foreach をぐるぐる回すのが効率よくないとか思っていましたが、
それよりも OnPaint() 内で値をいじらない方がよさそうです。
あと、無駄な変数多すぎ。
でも、実は高田馬場の勉強会のときのものは、
もっとグチャグチャで、それを直したのが、2つ前のエントリのだったりします。

続きを読む

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()

バイナリの中身

00000000  50 4B 03 04 0A 00 00 00 00 00 43 3D PK........C=
0000000C  ED 1D                               ..

ここから、pythonチュートリアルの逆を・・・