base1/
lib.rs

1/// Returns the amount of characters required to encode a given byte array in base1.
2///
3/// Base has to be **a power of 2 in base 10**. Suggested value is 256.
4pub fn encode(buf: &[u8], base: usize) -> usize {
5    let mut len = 0;
6    let mut block_size = 1;
7    for n in buf {
8        len *= base;
9        len += *n as usize;
10    }
11    for _ in buf {
12        len += block_size;
13        block_size *= base;
14    }
15    len
16}
17
18/// Returns a byte array based on an amount of characters in base1.
19///
20/// Base has to be **a power of 2 in base 10**. Suggested value is 256.
21pub fn decode(mut l: usize, base: usize) -> Vec<u8> {
22    let mut binary_len = 0;
23    let mut block_size: usize = 1;
24    while l >= block_size {
25        l -= block_size;
26        binary_len += 1;
27        block_size *= base;
28    }
29
30    let mut result = vec![0; binary_len];
31    for n in (0..binary_len).rev() {
32        let b = l & (base - 1);
33        result[n] = b as u8;
34        l -= b;
35        l /= base;
36    }
37    result
38}
39
40#[cfg(test)]
41mod test {
42    #[test]
43    fn decode_encoded() {
44        assert_eq!("adasddf", String::from_utf8_lossy(::decode(::encode("adasddf".as_bytes(), 256), 256).as_slice()));
45    }
46    #[test]
47    fn correct_len() {
48        assert_eq!(27696021251646823, ::encode("adasddf".as_bytes(), 256));
49    }
50}