我正在使用人機接口設備協議從外部設備獲取數據。我正在使用的庫返回一個字節數組([u8; 64]
),我想從一個字節中提取i7
(這將在Rust中爲i8
)。從u8提取7位有符號整數字節
我要處理的字節中有兩段不同的信息:
- 1位爲另一件事情事情
- 其他7位(我有解碼爲符號整數) 。
你知道我能做些什麼來達到這個目的嗎?
我正在使用人機接口設備協議從外部設備獲取數據。我正在使用的庫返回一個字節數組([u8; 64]
),我想從一個字節中提取i7
(這將在Rust中爲i8
)。從u8提取7位有符號整數字節
我要處理的字節中有兩段不同的信息:
你知道我能做些什麼來達到這個目的嗎?
使用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();
如果你想打開的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);
}
不工作。我已經能夠使它與以下庫https://crates.io/crates/bitreader一起工作。 – craigzour
請檢查如何創建[MCVE]。例如,向我們顯示輸入值和所需的輸出值將會走很長的路**。 – Shepmaster