diff options
author | Rangi <remy.oukaour+rangi42@gmail.com> | 2020-09-14 13:38:48 -0400 |
---|---|---|
committer | Rangi <remy.oukaour+rangi42@gmail.com> | 2020-09-14 13:38:48 -0400 |
commit | 5736e0a953cd442a76583dd6a9407b4a426115fb (patch) | |
tree | 299c8b450b263c8b95dba0ce336d8b8e92cb38c9 | |
parent | 5aead47e25a0985e114e347762a9fe596f86abff (diff) |
Start an xor compressor script
-rw-r--r-- | tools/xor_compress.py | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tools/xor_compress.py b/tools/xor_compress.py new file mode 100644 index 0000000..30418db --- /dev/null +++ b/tools/xor_compress.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +# Usage: ./xor_compress.py [source.bin] [dest.bin.xor] + +import sys + +with (open(sys.argv[1], 'rb') if len(sys.argv) > 1 else sys.stdin) as f: + data = f.read() + +n = len(data) +output = [] +v = 0 +i = 0 + +while i < n: + val = data[i] + i += 1 + + if data[i] == v: #>=0x80 + # Alternating (>= 0x80) + # Run stops at 0x81 bytes or when the values stop alternating + size = 1 + while i < n and size < 0x81 and data[i] == (v if size % 2 else val): + size += 1 + i += 1 + output.append(size + 0x7e) + output.append(v ^ val) + if size % 2: + v = val + + else: + # Sequential (< 0x80) + # Run stops at 0x80 bytes or when the value two ahead is equal to v + buffer = [v ^ val] + while i < n: + v = val + if len(buffer) > 0x7f or (i + 1 < n and data[i + 1] == v): + break + val = data[i] + buffer.append(v ^ val) + i += 1 + output.append(len(buffer) - 1) + output.extend(buffer) + +with (open(sys.argv[2], 'wb') if len(sys.argv) > 2 else sys.stdout) as f: + f.write(bytes(output)) |