pub fn encode(data: &[u8]) -> String {
const LINE_WIDTH: usize = 80;
let mut result = String::with_capacity((data.len() * 5 / 4) + (data.len() / 20) + 10);
let mut col = 0;
let chunks = data.chunks_exact(4);
let remainder = chunks.remainder();
for chunk in chunks {
let value = u32::from_be_bytes([chunk[0], chunk[1], chunk[2], chunk[3]]);
if value == 0 {
result.push('z');
col += 1;
} else {
let encoded = encode_group(value);
result.push_str(&encoded);
col += 5;
}
if col >= LINE_WIDTH {
result.push('\n');
col = 0;
}
}
if !remainder.is_empty() {
let mut padded = [0u8; 4];
padded[..remainder.len()].copy_from_slice(remainder);
let value = u32::from_be_bytes(padded);
let encoded = encode_group(value);
let needed = remainder.len() + 1;
result.push_str(&encoded[..needed]);
}
if col > LINE_WIDTH - 2 {
result.push('\n');
}
result.push_str("~>");
result
}
fn encode_group(value: u32) -> String {
let mut chars = [0u8; 5];
let mut v = value;
for char in chars.iter_mut().rev() {
*char = (v % 85) as u8 + b'!';
v /= 85;
}
String::from_utf8(chars.to_vec()).unwrap()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encode_empty() {
let result = encode(&[]);
assert_eq!(result, "~>");
}
#[test]
fn test_encode_zeros() {
let result = encode(&[0, 0, 0, 0]);
assert_eq!(result, "z~>");
}
#[test]
fn test_encode_basic() {
let result = encode(b"Man ");
assert_eq!(result, "9jqo^~>");
}
#[test]
fn test_encode_hello() {
let result = encode(b"Hello");
assert!(result.ends_with("~>"));
assert!(result.len() > 2);
}
#[test]
fn test_encode_8_zeros() {
let result = encode(&[0, 0, 0, 0, 0, 0, 0, 0]);
assert_eq!(result, "zz~>");
}
#[test]
fn test_encode_partial_groups() {
let result = encode(&[0xFF]);
assert!(result.ends_with("~>"));
assert!(!result.contains('z'));
let result = encode(&[0xFF, 0xFF]);
assert!(result.ends_with("~>"));
let result = encode(&[0xFF, 0xFF, 0xFF]);
assert!(result.ends_with("~>"));
}
#[test]
fn test_encode_mixed() {
let data = [0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF];
let result = encode(&data);
assert!(result.starts_with('z')); assert!(result.ends_with("~>"));
}
}