pub fn interleave(sym: &mut [u8; 63]) {
let mut tmp = [0u8; 63];
for i in 0..7 {
for j in 0..9 {
tmp[j * 7 + i] = sym[i * 9 + j];
}
}
*sym = tmp;
}
pub fn deinterleave(sym: &mut [u8; 63]) {
let mut tmp = [0u8; 63];
for i in 0..7 {
for j in 0..9 {
tmp[i * 9 + j] = sym[j * 7 + i];
}
}
*sym = tmp;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trip() {
let mut s = [0u8; 63];
for i in 0..63 {
s[i] = i as u8;
}
let original = s;
interleave(&mut s);
assert_ne!(s, original, "permutation must change order");
deinterleave(&mut s);
assert_eq!(s, original, "deinterleave must invert");
}
}