| #!/usr/bin/env python3 |
| # |
| # This is free and unencumbered software released into the public domain. |
| # |
| # Anyone is free to copy, modify, publish, use, compile, sell, or |
| # distribute this software, either in source code form or as a compiled |
| # binary, for any purpose, commercial or non-commercial, and by any |
| # means. |
| |
| def make_int_bits(value, nbits): |
| bits = list() |
| for i in range(nbits-1, -1, -1): |
| bits.append((value & (1 << i)) != 0) |
| return bits |
| |
| def ice_compress_bits(inbits): |
| outbits = list() |
| outbits += make_int_bits(0x49434543, 32) |
| outbits += make_int_bits(0x4f4d5052, 32) |
| |
| deltas = list() |
| numzeros = 0 |
| |
| for bit in inbits: |
| if bit: |
| deltas.append(numzeros) |
| numzeros = 0 |
| else: |
| numzeros += 1 |
| |
| i = 0 |
| while i < len(deltas): |
| raw_len = 0 |
| compr_len = 0 |
| best_compr_raw_diff = -1 |
| best_compr_raw_idx = -1 |
| best_compr_raw_len = -1 |
| |
| for j in range(len(deltas) - i): |
| delta = deltas[i+j] |
| raw_len += delta + 1 |
| |
| if delta < 4: |
| compr_len += 3 |
| elif delta < 32: |
| compr_len += 7 |
| elif delta < 256: |
| compr_len += 11 |
| else: |
| compr_len += 26 |
| |
| if compr_len - raw_len < max(best_compr_raw_diff - 4, 0) or raw_len > 64: |
| break |
| |
| if compr_len - raw_len > best_compr_raw_diff: |
| best_compr_raw_diff = compr_len - raw_len |
| best_compr_raw_idx = j |
| best_compr_raw_len = raw_len |
| |
| if best_compr_raw_diff > 9: |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(True) |
| outbits += make_int_bits(best_compr_raw_len-1, 6) |
| |
| for j in range(0, best_compr_raw_idx+1): |
| delta = deltas[i+j] |
| for k in range(delta): |
| outbits.append(False) |
| if j < best_compr_raw_idx: |
| outbits.append(True) |
| |
| i += best_compr_raw_idx + 1 |
| continue |
| |
| delta = deltas[i] |
| i += 1 |
| |
| if delta < 4: |
| outbits.append(True) |
| outbits += make_int_bits(delta, 2) |
| elif delta < 32: |
| outbits.append(False) |
| outbits.append(True) |
| outbits += make_int_bits(delta, 5) |
| elif delta < 256: |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(True) |
| outbits += make_int_bits(delta, 8) |
| else: |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(True) |
| outbits += make_int_bits(delta, 23) |
| |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(False) |
| outbits.append(False) |
| outbits += make_int_bits(numzeros, 23) |
| |
| return outbits |
| |
| def ice_compress_bytes(inbytes): |
| inbits = list() |
| for byte in inbytes: |
| for i in range(7, -1, -1): |
| inbits.append((byte & (1 << i)) != 0) |
| |
| outbits = ice_compress_bits(inbits) |
| |
| outbytes = list() |
| for i in range(0, len(outbits), 8): |
| byte = 0 |
| for k in range(i, min(i+8, len(outbits))): |
| if outbits[k]: byte |= 1 << (7-(k-i)) |
| outbytes.append(byte) |
| |
| return bytes(outbytes) |
| |
| # ------------------------------------------------------ |
| # Usage example: |
| # python3 icecompr.py < example_8k.bin > example_8k.compr |
| |
| if __name__ == '__main__': |
| import sys |
| inbytes = sys.stdin.buffer.read() |
| outbytes = ice_compress_bytes(inbytes) |
| sys.stdout.buffer.write(outbytes) |
| |