首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将u16的上下8位转换为u8?

如何将u16的上下8位转换为u8?
EN

Stack Overflow用户
提问于 2018-11-15 06:59:47
回答 2查看 11.8K关注 0票数 7

我想将一个u16转换成两个不同的u8

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
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

这个问题不是编译器为什么会产生不匹配的类型错误,而是我如何将u16的上下8位转换为u8?潜在地,还有其他方法可以做到这一点,并且这个问题并不限制as关键字的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-15 07:31:47

更新:在Rust 1.32.0中,有u16::to_be_bytes,它可以用于自定义函数。

代码语言:javascript
复制
fn main() {
    let bytes = 28923u16.to_be_bytes();
    assert_eq!([0x70, 0xFB], bytes);
}

您可以使用关键字以安全的方式将u16转换为u8

代码语言:javascript
复制
fn convert_u16_to_two_u8s_be(integer: u16) -> [u8; 2] {
    [(integer >> 8) as u8, integer as u8]
}

如果需要更多类型或不同的endianness,请使用附条箱

代码语言:javascript
复制
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
}
票数 20
EN

Stack Overflow用户

发布于 2018-11-15 07:31:53

您可以使用as在整数类型之间进行转换。

代码语言:javascript
复制
let b1 = n2 as u8;
let b2 = (n2 >> 8) as u8;

请注意,掩蔽是不必要的,因为强制转换将截断上位。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53314005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档