2017-04-05 20 views
-4

휴먼 인터페이스 장치 프로토콜을 사용하여 외부 장치에서 데이터를 가져옵니다. 내가 사용하고있는 라이브러리는 (녹에서 i8) 바이트를 추출하려는 바이트 배열 ([u8; 64])을 반환합니다.u8 바이트에서 7 비트 부호있는 정수를 추출하십시오.

I가 조작하고자하는 바이트는 정보의 서로 다른 두 개 가지고 다른 것은 뭔가

  • (I는 부호있는 정수로 디코딩해야 할) 7 개 개의 나머지 비트를위한

    • 1 비트 .

    이것을 달성하려면 어떻게해야합니까? 당신은 최상위 비트를 무시하고 i8의 벡터로 u8의 배열을 설정하려면

  • +2

    [MCVE]를 만드는 방법을 검토하십시오. 예를 들어, 입력 값과 원하는 출력 값을 보여 주면 ** 먼 길 ** 될 것입니다. – Shepmaster

    답변

    2

    제대로 7의 정수를 디코딩하는 내가 수 있었다 the crate bitreader 사용 비트.

    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

    , 당신은 다음과 같은 방법으로이를 수행 할 수 있습니다

    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 정보에 대해 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