如何在 Rust 中将字节数组转换为原始类型?

问题描述 投票:0回答:4

如何在 Rust 中将字节数组转换为原始类型?

let barry = [0, 0];
let shorty: u16 = barry;

我已经尝试过

let shorty: u16 = barry as u16;
,但由于“非标量转换”而不起作用。

casting rust
4个回答
5
投票

您可以使用按位运算。请注意,这取决于字节顺序。

fn main() {
   let barry = [0, 0];
   let shorty: u16 = barry[0] | (barry[1] << 8);
   println!("{0}", shorty);
}

4
投票

使用原始指针也有一种不安全的方法。好处是它适用于仅存在于堆栈中的任何类型。只要字节数组的格式正确,它就是完全安全的,因为没有指针被保留或修改。只要确保发生这种情况时不存在可变引用,我建议将其包装到一个函数中,该函数接受对字节数组和类型参数(具有

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. 
};

2
投票

byteorder crate 非常适合此目的。您可以指定字节序等。


0
投票

根据您想要的字节顺序,您可以使用原始类型的

from_be_bytes()
from_le_bytes()
from_ne_bytes()
方法之一,因为 Rust
1.32.0

例如:

let barry = [0, 0];
let shorty = u16::from_be_bytes(barry);

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.