Add RLE
This commit is contained in:
parent
941b7a1f07
commit
893f7917ef
Binary file not shown.
@ -106,9 +106,52 @@ def _encode_binary(binary: Binary) -> bytes:
|
|||||||
_write_u8(0)
|
_write_u8(0)
|
||||||
|
|
||||||
_write_u32(len(binary.starting_state))
|
_write_u32(len(binary.starting_state))
|
||||||
# TODO: No RLE for now
|
|
||||||
for b in binary.starting_state:
|
# == encode RLE ==
|
||||||
_write_u8(b)
|
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()
|
return out.getbuffer()
|
||||||
|
|
||||||
|
Binary file not shown.
@ -164,12 +164,29 @@ unsafe fn write_imports(
|
|||||||
prelude.write(&[0xc9, 0xc3]);
|
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::<u32>() as usize;
|
let length = reader.read::<u32>() 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::<u8>();
|
||||||
|
if code > 0 {
|
||||||
|
// RLE: repeat
|
||||||
|
let byte = reader.read::<u8>();
|
||||||
|
for i in 0..code {
|
||||||
|
*out = byte;
|
||||||
|
out = out.byte_add(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// N literal bytes
|
||||||
|
let count = reader.read::<u8>();
|
||||||
|
for _ in 0..count {
|
||||||
|
let byte = reader.read::<u8>();
|
||||||
|
*out = byte;
|
||||||
|
out = out.byte_add(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn _main_remote() {
|
unsafe fn _main_remote() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user