bitvec icon indicating copy to clipboard operation
bitvec copied to clipboard

Unaligned `load_le` / `load_be` return incorrect values

Open Finomnis opened this issue 4 months ago • 0 comments

Slices should return the same load_be/load_le values regardless of whether they are aligned to bytes (at least that's what I assume)

But currently, they don't:

use bitvec::prelude::*;

fn main() {
    println!("");
    println!("--- Byte-Aligned ---");

    let bv = bits![u8, Msb0; 0, 0, 0, 0, 1, 1, 1, 1];
    println!("Msb0+load_be: {} -> {:08b}", bv, bv.load_be::<u8>());

    let bv = bits![u8, Msb0; 0, 0, 0, 0, 1, 1, 1, 1];
    println!("Msb0+load_le: {} -> {:08b}", bv, bv.load_le::<u8>());

    let bv = bits![u8, Lsb0; 0, 0, 0, 0, 1, 1, 1, 1];
    println!("Lsb0+load_be: {} -> {:08b}", bv, bv.load_be::<u8>());

    let bv = bits![u8, Lsb0; 0, 0, 0, 0, 1, 1, 1, 1];
    println!("Lsb0+load_le: {} -> {:08b}", bv, bv.load_le::<u8>());

    println!();
    println!("--- Unaligned ---");

    let bv = bits![u8, Msb0; 0, 0, 0, 0, 0, 1, 1, 1, 1];
    let bv = &bv[1..];
    println!("Msb0+load_be: {} -> {:08b}", bv, bv.load_be::<u8>());

    let bv = bits![u8, Msb0; 0, 0, 0, 0, 0, 1, 1, 1, 1];
    let bv = &bv[1..];
    println!("Msb0+load_le: {} -> {:08b} (!)", bv, bv.load_le::<u8>());

    let bv = bits![u8, Lsb0; 0, 0, 0, 0, 0, 1, 1, 1, 1];
    let bv = &bv[1..];
    println!("Lsb0+load_be: {} -> {:08b} (!)", bv, bv.load_be::<u8>());

    let bv = bits![u8, Lsb0; 0, 0, 0, 0, 0, 1, 1, 1, 1];
    let bv = &bv[1..];
    println!("Lsb0+load_le: {} -> {:08b}", bv, bv.load_le::<u8>());

    println!();
}
--- Byte-Aligned ---
Msb0+load_be: [0, 0, 0, 0, 1, 1, 1, 1] -> 00001111
Msb0+load_le: [0, 0, 0, 0, 1, 1, 1, 1] -> 00001111
Lsb0+load_be: [0, 0, 0, 0, 1, 1, 1, 1] -> 11110000
Lsb0+load_le: [0, 0, 0, 0, 1, 1, 1, 1] -> 11110000

--- Unaligned ---
Msb0+load_be: [0, 0, 0, 0, 1, 1, 1, 1] -> 00001111
Msb0+load_le: [0, 0, 0, 0, 1, 1, 1, 1] -> 10000111 (!)
Lsb0+load_be: [0, 0, 0, 0, 1, 1, 1, 1] -> 11100001 (!)
Lsb0+load_le: [0, 0, 0, 0, 1, 1, 1, 1] -> 11110000

Finomnis avatar Aug 23 '25 21:08 Finomnis