Este archivo en particular usa un nivel 9 de compresión, y por lo que pude descifrar la entrada se divide en bloques de 8KiB, y se hace Z_SYNC_FLUSH luego de comprimir cada bloque, pero cada 8 bloques el algoritmo parece hacer otra cosa.
Este es el código que escribí para descomprimir y comprimir el archivo.
Para descomprimir funciona bien, pero solo comprime correctamente los primeros 7 bloques del archivo.
Código
import sys import zlib # python3 zlib-flate.py -d output.bin input.bin # python3 zlib-flate.py -9 input.bin output_test.bin def usage(): print("Usage:") print(f"python3 {sys.argv[0]} -[1-9,d] input.bin output.bin") exit() def main(): argc = len(sys.argv) if argc != 4: usage() try: if sys.argv[1] == "-d": # Decompress file with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file: data = input_file.read() comp_obj = zlib.decompressobj() data_plain = comp_obj.decompress(data) output_file.write(data_plain) else: # Compress file level = -int(sys.argv[1]) if level < 1 or level > 9: print("Invalid compression level") with open(sys.argv[2], "rb") as input_file, open(sys.argv[3], "wb") as output_file, open("output.bin", "rb") as test_file: comp_obj = zlib.compressobj(level) data = input_file.read(8 * 1024) # Read block of 8KiB i = 1 while data != b"": data_zip = comp_obj.compress(data) data_zip += comp_obj.flush(zlib.Z_SYNC_FLUSH) # Check if compressed data differs lenght = len(data_zip) data_test = test_file.read(lenght) if data_zip == data_test: print(f"Block #{i}: correctly compressed") else: print(f"Block #{i}: invalid data") exit() output_file.write(data_zip) data = input_file.read(8 * 1024) i = i + 1 print("File compressed correctly!") except (IOError, ValueError) as error: print("Invalid parameters") main()
Archivo comprimido con zlib:
https://mega.nz/file/8a5C1SyQ#xqy9nCycTrWfrnwuvWa39xd128s9huSFuf8kOr6kK8Q