我应该如何在Rust中将字节数组转换为基本类型?
let barry = [0, 0];
let shorty: u16 = barry;
我已经尝试过 let shorty: u16 = barry as u16;
,但由于"非标量转换"而无法正常工作。
fn main() {
let barry = [0, 0];
let shorty: u16 = barry[0] | (barry[1] << 8);
println!("{0}", shorty);
}
使用原始指针也可以以不安全的方式完成此操作。好处是它适用于仅存在于堆栈上的任何类型。只要字节数组格式正确,它就是完全安全的,因为没有保留或修改指针。只需确保在进行此操作时不存在可变引用,我建议将其封装到一个函数中,该函数接受一个字节数组和一个类型参数(具有 Clone
trait),这样借用检查器就可以处理该情况。
let bytes = [0u8, 0u8];
let value = unsafe {
let byte_ptr = bytes.as_ptr();
let ptr = byte_ptr as *const u16; // This could be any type
(*ptr).clone() // We clone it so that no
// matter what type it is, it gets dereferenced.
};
from_be_bytes()
、from_le_bytes()
或from_ne_bytes()
,自Rust 1.32.0
起。
E.g.:
let barry = [0, 0];
let shorty = u16::from_be_bytes(barry);
let shorty:u16 = barry [0] as u16 |(barry [1] as u16 << 8);
- Jeroen