blob: d4a11384f534ae460ae39a2a136233733e06d246 [file] [log] [blame] [edit]
/// 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)
}