前提・実現したいこと
Python: 3.6.4
公式ドキュメントの「11.3. バイナリデータレコードの操作」を学習しています。
公式:https://docs.python.jp/3/tutorial/stdlib2.html
struct.unpack(fmt, buffer)の記述の意味がよくわかりません。
検索しても欲しい情報になかなかヒットせず、お手上げです。
以下に何がわからないのか挙げておりますので、解説よろしくお願い致します。
発生している問題・エラーメッセージ
b'myfile.xlsx' 0xe4c7c4a2 7085 9753 b'' 0xc4a24d2e 464381127 639172608 Traceback (most recent call last): File "<stdin>", line 3, in <module> struct.error: unpack requires a buffer of 16 bytes
該当のソースコード
用意した'myfile.zip'にはExcelファイルが入っています。
適当に、A1セル:あいうえ, B1セル:aiueo, C1セル:12345 と記述してあります。
Python
1>>> import struct 2>>> 3>>> with open('myfile.zip', 'rb') as f: 4... data = f.read() 5... 6>>> start = 0 7>>> for i in range(3): # show the first 3 file headers 8... start += 14 9... fields = struct.unpack('<IIIHH', data[start:start+16]) # ここがよくわからない 10... crc32, comp_size, uncomp_size, filenamesize, extra_size = fields 11... 12... start += 16 13... filename = data[start:start+filenamesize] 14... start += filenamesize # ここでERROR 15... extra = data[start:start+extra_size] 16... print(filename, hex(crc32), comp_size, uncomp_size) 17... 18... start += extra_size + comp_size # skip to the next header
参考にしたURL
以下は、すべてこちらを参考にしております。
https://docs.python.jp/3/library/struct.html#struct.calcsize
わからないこと①
'<IIIHH'の'<'のサイズ「standard」とは、何を基準にスタンダードと言っているのでしょうか?
わからないこと②
IIIHH は合わせて何バイトなのでしょうか?
2+2+2+4+4 で14バイトでしょうか?
わからないこと③
unpack()の第一引数 fmt が何をしているのかわかりません。
unpack()について、
書式文字列 fmt に従って、構造体 (それと pack(fmt, ...) によって作成されるバイト列オブジェクト) のサイズを返します。
と書いてあるのですが、さっぱりです・・・。
わからないこと④
今回、struct.errorが出ていますが、このエラーについて調べてみると以下の記述がありました。
整数フォーマット ('b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q') のいずれかを使って値 x をパックするとき x がフォーマットの適切な値の範囲に無い場合、 struct.error が送出されます。
つまり、'<IIIHH'バイトサイズと、data[start:start+16]の範囲のサイズがあっていないということでしょうか?
data[start:start+16]のバイト数を調べて、'<IIIHH'の部分を変更して、完全に同じサイズにしなければならないということですか?
質問が多くてすいません。回答よろしくお願い致します。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。