我正在使用人机接口设备协议从外部设备获取数据。我使用的库返回一个字节数组([u8; 64]
),我想从一个字节中提取i7
(在Rust中为i8
)。
我想要操作的字节中包含两个不同的信息:
你知道我能做些什么来实现这个目标吗?
答案 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();