• 11.3. 使用二进制数据记录格式

    11.3. 使用二进制数据记录格式

    struct 模块提供了 pack()unpack() 函数,用于处理不定长度的二进制记录格式。下面的例子展示了在不使用 zipfile 模块的情况下,如何循环遍历一个 ZIP 文件的所有头信息。Pack 代码 "H""I" 分别代表两字节和四字节无符号整数。"<" 代表它们是标准尺寸的小尾型字节序:

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