从 u8 字节中提取 7 位有符号整数
Extract 7 bits signed integer from u8 byte
我正在使用人机接口设备协议从外部设备获取数据。我正在使用 returns 一个字节数组 ([u8; 64]
) 的库,我想从一个字节中提取一个 i7
(在 Rust 中将是 i8
)。
我要操作的字节里面有两条不同的信息:
- 1 位的东西
- 其他 7 位(我必须将其解码为带符号的整数)用于另一件事。
你知道我能做些什么吗?
如果要将 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();
我正在使用人机接口设备协议从外部设备获取数据。我正在使用 returns 一个字节数组 ([u8; 64]
) 的库,我想从一个字节中提取一个 i7
(在 Rust 中将是 i8
)。
我要操作的字节里面有两条不同的信息:
- 1 位的东西
- 其他 7 位(我必须将其解码为带符号的整数)用于另一件事。
你知道我能做些什么吗?
如果要将 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();