/// https://developers.google.com/protocol-buffers/docs/encoding#varints pub fn write_varu64(data: &mut [u8], mut n: u64) -> usize { let mut i = 0; while n >= 0b1000_0000 { data[i] = (n as u8) | 0b1000_0000; n >>= 7; i += 1; } data[i] = n as u8; i + 1 } /// https://developers.google.com/protocol-buffers/docs/encoding#varints pub fn read_varu64(data: &[u8]) -> (u64, usize) { let mut n: u64 = 0; let mut shift: u32 = 0; for (i, &b) in data.iter().enumerate() { if b < 0b1000_0000 { return match (b as u64).checked_shl(shift) { None => (0, 0), Some(b) => (n | b, i + 1), }; } match ((b as u64) & 0b0111_1111).checked_shl(shift) { None => return (0, 0), Some(b) => n |= b, } shift += 7; } (0, 0) }