pubfn read_vec<T, R>(r: &mut T) -> Res<Option<Vec<u8>>> where
T: BorrowMut<R> + ?Sized,
R: ReadSeek + ?Sized,
{ use std::io::SeekFrom;
iflet Some(len) = read_varint(r)? { // Check that the input contains enough data. Before allocating. let r = r.borrow_mut(); let pos = r.stream_position()?; let end = r.seek(SeekFrom::End(0))?; if end - pos < len { return Err(Error::Truncated);
}
_ = r.seek(SeekFrom::Start(pos))?;
#[test] fn basics() { for i in [ 0_u64, 1, 17, 63, 64, 100, 0x3fff, 0x4000, 0x1_0002, 0x3fff_ffff, 0x4000_0000, 0x3456_dead_beef, 0x3fff_ffff_ffff_ffff,
] { letmut buf = Vec::new();
write_varint(i, &mut buf).unwrap(); let sz_bytes = (64 - i.leading_zeros() + 2).div_ceil(8); // +2 size bits, rounded up
assert_eq!(
buf.len(),
usize::try_from(sz_bytes.next_power_of_two()).unwrap()
);
let o = read_varint(&mut Cursor::new(buf.clone())).unwrap();
assert_eq!(Some(i), o);
for cut in1..buf.len() { let e = read_varint(&mut Cursor::new(buf[..cut].to_vec())).unwrap_err();
assert!(matches!(e, Error::Truncated));
}
}
}
#[test] fn read_nothing() { let o = read_varint(&mut Cursor::new(Vec::new())).unwrap();
assert!(o.is_none());
}
#[test] #[should_panic(expected = "varint value too large")] fn too_big() {
std::mem::drop(write_varint(0x4000_0000_0000_0000_u64, &mutVec::new()));
}
#[test] fn too_big_vec() { letmut buf = Vec::new();
write_varint(10_u64, &mut buf).unwrap();
buf.resize(10, 0); // Not enough extra for the promised length. let e = read_vec(&mut Cursor::new(buf.clone())).unwrap_err();
assert!(matches!(e, Error::Truncated));
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.