如何在 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
特征)的引用,以便借用检查器可以处理就那个案例。
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.
};
byteorder crate 非常适合此目的。您可以指定字节序等。
根据您想要的字节顺序,您可以使用原始类型的
from_be_bytes()
、from_le_bytes()
或 from_ne_bytes()
方法之一,因为 Rust 1.32.0
。
例如:
let barry = [0, 0];
let shorty = u16::from_be_bytes(barry);