从 u8 字节中提取 7 位有符号整数

Extract 7 bits signed integer from u8 byte

我正在使用人机接口设备协议从外部设备获取数据。我正在使用 returns 一个字节数组 ([u8; 64]) 的库,我想从一个字节中提取一个 i7(在 Rust 中将是 i8)。

我要操作的字节里面有两条不同的信息:

你知道我能做些什么吗?

如果要将 u8 的数组转换为 i8 的向量,同时忽略最高有效位,可以按以下方式进行:

fn main() {
    let array_unsigned = [1u8, 2, 3]; // this will work for 64 values too
    let vec_signed: Vec<i8> = array_unsigned.into_iter()
        .map(|&e| if e <= 127 { e as i8 } else { (e - 128) as i8 }).collect();

    println!("{:?}", vec_signed);
}

这种方式消耗输入数组。它可能可以通过一些位摆弄以更好的方式完成。

你的问题很不清楚,但我认为你只是在问普通的位操作。屏蔽7位(假设7位,虽然你没说),把剩下的位转换成有符号数:

fn main() {
    let byte = 0xFFu8;
    let byte2 = (byte & 0b0111_1111) as i8;
    println!("{}", byte2);
}

使用 the crate bitreader 我已经能够正确解码 7 位的带符号整数。

let mut bit_reader = BitReader::new(buffer);
let first_useless_bit: u8 = bit_reader.read_u8(1).unwrap();
let extracted_value: i8 = bit_reader.read_i8(7).unwrap();