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

时间:2017-04-05 12:15:39

标签: rust byte endianness

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

我想要操作的字节中包含两个不同的信息:

  • 1比特
  • 另外7个其他位(我必须解码为有符号整数)。

你知道我能做些什么来实现这个目标吗?

3 个答案:

答案 0 :(得分:4)

你的问题很不清楚,但我认为你只是在询问正常的位操作。屏蔽7位(假设 7位,尽管你没有说),并将剩余的位转换为带符号的数字:

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

答案 1 :(得分:3)

如果要将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);
}

这种方式消耗输入数组。它可能会以一种更好的方式完成,并且会有些烦人。

答案 2 :(得分:2)

使用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();