如何在Rust中将字节数组转换为基本类型?
let barry = [0, 0];
let shorty: u16 = barry;
我已经尝试let shorty: u16 = barry as u16;
,但由于"非标量演员" 而无法正常工作。
答案 0 :(得分:4)
您可以使用按位运算。请注意,这取决于字节顺序。
fn main() {
let barry = [0, 0];
let shorty: u16 = barry[0] | (barry[1] << 8);
println!("{0}", shorty);
}
答案 1 :(得分:1)
The byteorder crate is great for this. You can specify endianness, etc.
答案 2 :(得分:1)
使用原始指针也有一种不安全的方法。好处是它适用于仅存在于堆栈中的任何类型。只要正确格式化了字节数组,这是完全安全的,因为没有指针被保留或修改。只要确保在进行此操作时不存在任何可变引用,我建议将其包装到一个对字节数组和类型参数(具有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.
};