2017-04-05 44 views
-4

我正在使用人機接口設備協議從外部設備獲取數據。我正在使用的庫返回一個字節數組([u8; 64]),我想從一個字節中提取i7(這將在Rust中爲i8)。從u8提取7位有符號整數字節

我要處理的字節中有兩段不同的信息:

  • 1位爲另一件事情事情
  • 其他7位(我有解碼爲符號整數) 。

你知道我能做些什麼來達到這個目的嗎?

+2

請檢查如何創建[MCVE]。例如,向我們顯示輸入值和所需的輸出值將會走很長的路**。 – Shepmaster

回答

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(); 
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); 
} 

這樣消耗輸入數組。這可能可以通過一些更好的方式完成,並且有些小小的擺弄。

+0

不幸的是,這不是我在找的,但感謝你的幫助,雖然:)我真的想從一個簡單的字節(u8)中獲取7位並將其解碼爲有符號整數。 – craigzour

+0

噢,我猜我忘了提到一些東西。我想操縱的字節有兩個不同的信息。 1位用於第一信息,另外7位用於另一信息。所以是的,如果整個字節只包含一個信息,你的解決方案就可以工作 – craigzour

+0

@craigzour現在怎麼樣?這種方式應該丟棄最重要位中包含的信息。 – ljedrz

4

你的問題還不太清楚,但我想你只是想問一下正常的位操作。面膜的7位(假設 7位,雖然你沒有說),其餘位轉換爲符號數:

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

不工作。我已經能夠使它與以下庫https://crates.io/crates/bitreader一起工作。 – craigzour