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

5
我应该如何在Rust中将字节数组转换为基本类型?
let barry = [0, 0];
let shorty: u16 = barry;

我已经尝试过 let shorty: u16 = barry as u16;,但由于"非标量转换"而无法正常工作。

4个回答

5
您可以使用位运算。请注意,这取决于字节顺序。
fn main() {
   let barry = [0, 0];
   let shorty: u16 = barry[0] | (barry[1] << 8);
   println!("{0}", shorty);
}

谢谢你的回答,是的,我知道字节序问题。我正在使用标准库将其转换为本机格式。 - Jeroen
此外,似乎为了使其正常工作,需要将barry [0]和barry [1]转换为u16。 let shorty:u16 = barry [0] as u16 |(barry [1] as u16 << 8); - Jeroen
1
我尝试了Web Runner(rust-lang.org)。但是,说实话,我对Rust语言的发展严重落后,所以我无法判断。 - Alexander Gessler

4

使用原始指针也可以以不安全的方式完成此操作。好处是它适用于仅存在于堆栈上的任何类型。只要字节数组格式正确,它就是完全安全的,因为没有保留或修改指针。只需确保在进行此操作时不存在可变引用,我建议将其封装到一个函数中,该函数接受一个字节数组和一个类型参数(具有 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. 
};

2
根据你想要的字节序,你可以使用原始类型的方法之一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);

游乐场


2

使用byteorder crate可以很好地解决这个问题。您可以指定字节序等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接