Skip to main content

spvirit_codec/
encode_common.rs

1/// Encode a variable-length integer (PVA size encoding).
2///
3/// Values 0..253 are stored as a single byte. Values >= 254 are stored as
4/// 0xFE followed by a 4-byte u32.
5pub fn encode_size(size: usize, is_be: bool) -> Vec<u8> {
6    if size == 0 {
7        return vec![0x00];
8    }
9    if size < 254 {
10        return vec![size as u8];
11    }
12    let mut out = vec![0xFE];
13    let bytes = if is_be {
14        (size as u32).to_be_bytes()
15    } else {
16        (size as u32).to_le_bytes()
17    };
18    out.extend_from_slice(&bytes);
19    out
20}
21
22/// Encode a string as a PVA size-prefixed byte sequence.
23pub fn encode_string(value: &str, is_be: bool) -> Vec<u8> {
24    let bytes = value.as_bytes();
25    let mut out = encode_size(bytes.len(), is_be);
26    out.extend_from_slice(bytes);
27    out
28}