#!/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)