Skip to content
Snippets Groups Projects
deflate.py 1.05 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env python3
    
    import sys
    import zlib
    
    level = -1
    if len(sys.argv) > 2:
        level = int(sys.argv[2])
    
    input_data = sys.argv[1].encode("utf-8")
    
    try:
        with open(sys.argv[1], "rb") as f:
            input_data = f.read()
    except FileNotFoundError:
        input_data = sys.argv[1].encode("utf-8")
    
    output = zlib.compress(input_data, level=level)
    
    cinfo = (output[0] & 0xF0) >> 4
    window_size = 1 << (8 + cinfo)
    print(f"// CINFO = {cinfo}  (window size = {window_size})")
    
    fdict = output[1] & 0x20
    if fdict:
        print("// FDICT = 1 (preset dictionary in use)")
    else:
        print("// FDICT = 0 (no preset dictionary)")
    
    is_final = output[2] & 0x01
    block_type = (output[2] & 0x06) >> 1
    
    print(f"// first Huffman block: type={block_type} is_final={is_final}")
    
    print(f"// {sys.argv[1]}")
    print("unsigned char const inflate_input[] = {" + ", ".join(map(str, output)) + "};")
    print(f"unsigned short const inflate_input_size = {len(output)};")
    
    print(f"unsigned char deflate_output[{len(input_data) + 1}];")
    print(f"unsigned short const deflate_output_size = {len(input_data) + 1};")