Skip to content
Snippets Groups Projects
rle.rs 832 B
Newer Older
pub fn encode_rle(data: &[u8]) -> Vec<u8> {
    if data.is_empty() {
        return Vec::new();
    }

    let mut encoded = Vec::new();
    let mut prev_byte = data[0];
    let mut count = 1;

    for &byte in data.iter().skip(1) {
        if count != 255 && byte == prev_byte {
            count += 1;
        } else {
            encoded.push(prev_byte);
            encoded.push(count);
            prev_byte = byte;
            count = 1;
        }
    }
    encoded.push(prev_byte);
    encoded.push(count);

    encoded
}

pub fn decode_rle(data: &[u8]) -> Vec<u8> {
    let mut decoded = Vec::new();

    let mut iter = data.iter();
    while let Some(&byte) = iter.next() {
        if let Some(&count) = iter.next() {
            decoded.extend(std::iter::repeat(byte).take(count as usize));
        }
    }

    decoded
}