Как я могу преобразовать младшие / старшие 8 бит u16 в u8 в Rust? - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу преобразовать u16 в два отдельных u8 с. Я пытался использовать некоторые битовые маски:

use std::convert::From;

fn main() {
    let n1: u8 = 0x41;
    let n2: u16 = 0x4157;

    println!("Number:{}", char::from(n1));

    let b1: u8 = n2 & 0xFF;
    let b2: u8 = n2 >> 8;

    println!("b1: {}", b1);
    println!("b2: {}", b2);
}
error[E0308]: mismatched types
 --> src/main.rs:9:18
  |
9 |     let b1: u8 = n2 & 0xFF;
  |                  ^^^^^^^^^ expected u8, found u16

error[E0308]: mismatched types
  --> src/main.rs:10:18
   |
10 |     let b2: u8 = n2 >> 8;
   |                  ^^^^^^^ expected u8, found u16

Этот вопрос не , почему компилятор вызывает ошибку несоответствующего типа? , скорее, это Как я могу преобразовать младшие / старшие 8 бит u16 в u8 в ржавчине? . Потенциально, есть другие способы сделать это, и этот вопрос не ограничивает ответ на ключевое слово as.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вы можете привести между целочисленными типами с помощью as.

let b1 = n2 as u8;
let b2 = (n2 >> 8) as u8;

Обратите внимание, что маскировка не нужна, потому что приведение будет обрезать верхние биты.

0 голосов
/ 15 ноября 2018

Обновление: Начиная с Rust 1.32.0 существует u16::to_be_bytes, который можно использовать в качестве пользовательской функции.

fn main() {
    let bytes = 28923u16.to_be_bytes();
    assert_eq!([0x70, 0xFB], bytes);
}

Вы можете использовать ключевое слово as для безопасного преобразования u16 в u8.

fn convert_u16_to_two_u8s_be(integer: u16) -> [u8; 2] {
    [(integer >> 8) as u8, integer as u8]
}

Если вам нужно больше типов или другой порядок байтов, используйте ящик с метеорологом .

extern crate byteorder;

use byteorder::{WriteBytesExt, BigEndian};

fn convert_u16_to_two_u8s_be(integer: u16) -> Vec<u8> {
    let mut res = vec![];
    res.write_u16::<BigEndian>(integer).unwrap();
    res
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...