Zip実装会・・復習編(第2回のを)

この辺を見ながら、いろいろ悩む
http://www.tnksoft.com/reading/zipfile/nonarc1.php
http://www.tnksoft.com/reading/zipfile/nonarc2.php

おっきな流れ

とりあえず、zip ファイル作って、bvi (バイナリエディタ) で開いて、
pythonでヘッダぽいものを付けていく。

zipってどうなってるの?

touch hoge.txt
zip hoge.zip hoge.txt
bvi hoge.zip

こんな結果になりました。

00000000  50 4B 03 04 0A 00 00 00 00 00 77 04 PK........w.
0000000C  43 3D 00 00 00 00 00 00 00 00 00 00 C=..........
00000018  00 00 08 00 1C 00 68 6F 67 65 2E 74 ......hoge.t
00000024  78 74 55 54 09 00 03 51 51 A7 4C 3A xtUT...QQ.L:
00000030  57 A7 4C 75 78 0B 00 01 04 E8 03 00 W.Lux.......
0000003C  00 04 E8 03 00 00 50 4B 01 02 1E 03 ......PK....
00000048  0A 00 00 00 00 00 77 04 43 3D 00 00 ......w.C=..
00000054  00 00 00 00 00 00 00 00 00 00 08 00 ............
00000060  18 00 00 00 00 00 00 00 00 00 A4 81 ............
0000006C  00 00 00 00 68 6F 67 65 2E 74 78 74 ....hoge.txt
00000078  55 54 05 00 03 51 51 A7 4C 75 78 0B UT...QQ.Lux.
00000084  00 01 04 E8 03 00 00 04 E8 03 00 00 ............
00000090  50 4B 05 06 00 00 00 00 01 00 01 00 PK..........
0000009C  4E 00 00 00 42 00 00 00 00 00       N...B.....

値を抜粋

http://www.tnksoft.com/reading/zipfile/nonarc2.php
signatureでは、0x04034B50(KB0304)を指定します。
って書いてあるので、50 4B 03 04 が signature だということで、決めうちでバイナリに書き込みます。

python でバイナリ編集

import struct
f = open("hoge1.zip", "wb")
f.write(struct.pack('<L', 0x04034B50))
f.close()

こんなカンジで signature が書き込めます。


bvi で中身を見ると

00000000  50 4B 03 04

うん、合ってる合ってる。


ちなみに pack関数ですが、リトルエンディアンなので 50 4B 03 04 が 04 03 4B 50 と並べるみたいです。