From 893f7917ef7c0da9cce39267aac9d8358b64c44f Mon Sep 17 00:00:00 2001 From: Nyeogmi Date: Fri, 25 Apr 2025 21:50:29 -0700 Subject: [PATCH] Add RLE --- analyzer/binaries/main.dat | Bin 20540 -> 5198 bytes analyzer/main.py | 49 ++++++++++++++++++++++++++++++++++--- runner/src/main.dat | Bin 20540 -> 5198 bytes runner/src/main.rs | 25 ++++++++++++++++--- 4 files changed, 67 insertions(+), 7 deletions(-) diff --git a/analyzer/binaries/main.dat b/analyzer/binaries/main.dat index 18c91172a63d1c0c10301210e7cd6a73c8f3f1b1..2f89bbd8f55569fd7949c8ebdbde513f3f979d56 100644 GIT binary patch delta 1210 zcmaJ=ZA@EL7=G@#w@?ZzOpx&@Wr{;=prwVDj}8iH)2_6uu)7UnkTR$tcETJQ)F16w zvdl5U;@O;##Zl+}n3=ffjOY>}7?w!0WR1+2EFlp$F_6t=nOSh#@!XO){eihT_c_n| z-gDpQee#~mlfu=~6ZK(imUp`jua>$-L(l14qgA&n01aI4-8IJTUrQi>xcrO)($umD zB*7S8CJIkp`GuA2$N=BRQesg3Ls;ya7{kVo7HXzWEQnoU9a4CSuXMZsB8m6FdT2I5 zPUw)!^OHJk;_&G@JYnfP*cR%As&~LKq^Nq@9}2wP*8k?~J@7bMeU27WWqD5sNg?cU z`@E363L_!#RyGN#Qb{;fOll%sg8zR6Z`{h0OcNK<>UKhMMlyj^?6L251osc>64oWl z5YSkpv^dEXOK4R5LmH2U6JDl8BmoCh!N9)3b;}!{S3YQQx9!SPy3)9P&YkWy=Ps?n z(pmy<1*>YxD=pjv=8~-IOtU_25|sE&FZl%&!W! zqI6*u?W=wF&a514kZ#ax2LDsgYA!~PcIO-^KBn6D?3Fv{q!q@_Vi6Mew2ONs4k7)W zA7<5v2uH#XqOATEMi}(;GozlsNq;sv2~N_Y%99!-v$dV#G oOv-F>Ti)Pe5>v?sR}@{!#Z&(~uaW=D?{mFJGdH-662l?<4SW80X8-^I literal 20540 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 diff --git a/analyzer/main.py b/analyzer/main.py index a25fc7b..ed4ee07 100644 --- a/analyzer/main.py +++ b/analyzer/main.py @@ -106,9 +106,52 @@ def _encode_binary(binary: Binary) -> bytes: _write_u8(0) _write_u32(len(binary.starting_state)) - # TODO: No RLE for now - for b in binary.starting_state: - _write_u8(b) + + # == encode RLE == + def _pull_repeats(start: int, data: bytes) -> int | None: + i = 0 + first_byte = data[start + i] + while True: + if i >= 255: + break + if start + i >= len(data): + break + if data[start + i] != first_byte: + break + + i += 1 + + if i >= 2: + _write_u8(i) + _write_u8(first_byte) + return start + i + + return None + + def _pull_non_repeats(start: int, data: bytes): + i = 0 + while True: + if i >= 255: + break + if start + i >= len(data): + break + if i >= 1 and data[start + i] == data[start + i - 1]: + break + + i += 1 + + _write_u8(0) + _write_u8(i) + for j in range(i): + _write_u8(data[start + j]) + return start + i + + i = 0 + while i < len(binary.starting_state): + if new_i := _pull_repeats(i, binary.starting_state): + i = new_i + continue + i = _pull_non_repeats(i, binary.starting_state) return out.getbuffer() diff --git a/runner/src/main.dat b/runner/src/main.dat index 18c91172a63d1c0c10301210e7cd6a73c8f3f1b1..2f89bbd8f55569fd7949c8ebdbde513f3f979d56 100644 GIT binary patch delta 1210 zcmaJ=ZA@EL7=G@#w@?ZzOpx&@Wr{;=prwVDj}8iH)2_6uu)7UnkTR$tcETJQ)F16w zvdl5U;@O;##Zl+}n3=ffjOY>}7?w!0WR1+2EFlp$F_6t=nOSh#@!XO){eihT_c_n| z-gDpQee#~mlfu=~6ZK(imUp`jua>$-L(l14qgA&n01aI4-8IJTUrQi>xcrO)($umD zB*7S8CJIkp`GuA2$N=BRQesg3Ls;ya7{kVo7HXzWEQnoU9a4CSuXMZsB8m6FdT2I5 zPUw)!^OHJk;_&G@JYnfP*cR%As&~LKq^Nq@9}2wP*8k?~J@7bMeU27WWqD5sNg?cU z`@E363L_!#RyGN#Qb{;fOll%sg8zR6Z`{h0OcNK<>UKhMMlyj^?6L251osc>64oWl z5YSkpv^dEXOK4R5LmH2U6JDl8BmoCh!N9)3b;}!{S3YQQx9!SPy3)9P&YkWy=Ps?n z(pmy<1*>YxD=pjv=8~-IOtU_25|sE&FZl%&!W! zqI6*u?W=wF&a514kZ#ax2LDsgYA!~PcIO-^KBn6D?3Fv{q!q@_Vi6Mew2ONs4k7)W zA7<5v2uH#XqOATEMi}(;GozlsNq;sv2~N_Y%99!-v$dV#G oOv-F>Ti)Pe5>v?sR}@{!#Z&(~uaW=D?{mFJGdH-662l?<4SW80X8-^I literal 20540 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 diff --git a/runner/src/main.rs b/runner/src/main.rs index 552f212..46001a9 100644 --- a/runner/src/main.rs +++ b/runner/src/main.rs @@ -164,12 +164,29 @@ unsafe fn write_imports( prelude.write(&[0xc9, 0xc3]); } -unsafe fn write_starting_state(binary: *mut u8, reader: &mut Reader) { +unsafe fn write_starting_state(mut out: *mut u8, reader: &mut Reader) { let length = reader.read::() as usize; - let ptr = reader.ptr; - println!("length: {:?}", length); - binary.copy_from(ptr, length); + let end = out.byte_add(length); + while out < end { + let code = reader.read::(); + if code > 0 { + // RLE: repeat + let byte = reader.read::(); + for i in 0..code { + *out = byte; + out = out.byte_add(1); + } + } else { + // N literal bytes + let count = reader.read::(); + for _ in 0..count { + let byte = reader.read::(); + *out = byte; + out = out.byte_add(1); + } + } + } } unsafe fn _main_remote() {