|
| 1 | +eocd_sig = b"\x50\x4b\x05\x06" |
| 2 | +cd_fh_sig = b"\x50\x4b\x01\x02" |
| 3 | +local_fh_sig = b"\x50\x4b\x03\x04" |
| 4 | +from struct import pack |
| 5 | + |
| 6 | + |
| 7 | + |
| 8 | +def create_zip(name, data): |
| 9 | + local_fh = zip_local_fileheader(len(name), name, len(data), len(data), data) |
| 10 | + cd_fh = zip_cd_fileheader(len(name), name, len(data), len(data), 0) |
| 11 | + eocd = zip_eocd(len(local_fh) , len(cd_fh)) |
| 12 | + return local_fh + cd_fh + eocd |
| 13 | + |
| 14 | + |
| 15 | +def zip_eocd(cd_offset, cd_size, disk_no=0, disk_no_cd=0, disk_entries=1, total_entries=1, comment_len=0, comment=b""): |
| 16 | + return eocd_sig + pack("<HHHHIIH", |
| 17 | + disk_no, |
| 18 | + disk_no_cd, |
| 19 | + disk_entries, |
| 20 | + total_entries, |
| 21 | + cd_size, |
| 22 | + cd_offset, |
| 23 | + comment_len) + comment |
| 24 | + |
| 25 | + |
| 26 | +def zip_cd(list_file_headers): |
| 27 | + res = ""; |
| 28 | + for file_header in list_file_headers: |
| 29 | + res += file_header |
| 30 | + return res |
| 31 | + |
| 32 | + |
| 33 | +def zip_cd_fileheader(file_name_len,file_name,compressed_size, uncompressed_size, local_header_offset, version=0x31e, version_needed=0xa, flags=0, compression=0, crc32=0, modtime=0, moddate=0, extra_field_len=0, file_comment_len=0, disk_start=0, internal_attr=0,external_attr=0, extra_field=b"", file_comment=b""): |
| 34 | + return cd_fh_sig + pack("<HHHHHHIIIHHHHHII", |
| 35 | + version, |
| 36 | + version_needed, |
| 37 | + flags, |
| 38 | + compression, |
| 39 | + modtime, |
| 40 | + moddate, |
| 41 | + crc32, |
| 42 | + compressed_size, |
| 43 | + uncompressed_size, |
| 44 | + file_name_len, |
| 45 | + extra_field_len, |
| 46 | + file_comment_len, |
| 47 | + disk_start, |
| 48 | + internal_attr, |
| 49 | + external_attr, |
| 50 | + local_header_offset) + file_name + extra_field + file_comment |
| 51 | + |
| 52 | +def zip_local_fileheader(file_name_len, file_name, compressed_size, uncompressed_size, data, version=0xa, flags=0, compression=0, modtime=0, moddate=0, crc32=0, extra_field_len=0, extra_field=b""): |
| 53 | + return local_fh_sig + pack("<HHHHHIIIHH", |
| 54 | + version, |
| 55 | + flags, |
| 56 | + compression, |
| 57 | + modtime, |
| 58 | + moddate, |
| 59 | + crc32, |
| 60 | + compressed_size, |
| 61 | + uncompressed_size, |
| 62 | + file_name_len, |
| 63 | + extra_field_len) + file_name + extra_field + data |
| 64 | + |
| 65 | + |
0 commit comments