gpt4 book ai didi

rust - 如何在 Rust 中将 u16 的低/高 8 位转换为 u8?

转载 作者:行者123 更新时间:2023-11-29 08:01:38 25 4
gpt4 key购买 nike

我想转换一个 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

这个问题不是为什么编译器会引发类型不匹配的错误?,而是如何转换 u16 的低/高 8 位?到 u8在 Rust 中?。可能还有其他方法可以做到这一点,这个问题并不限制对 as 的回答。关键字。

最佳答案

更新:从 Rust 1.32.0 开始有 u16::to_be_bytes ,可用于支持自定义函数。

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

您可以使用 as keyword以安全的方式将 u16 转换为 u8

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

如果您需要更多类型或不同的字节顺序,请使用 byteorder crate .

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
}

关于rust - 如何在 Rust 中将 u16 的低/高 8 位转换为 u8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53314005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com