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

acruukt9  于 2023-11-19  发布在  其他
关注(0)|答案(4)|浏览(146)

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

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

字符串
我已经尝试过let shorty: u16 = barry as u16;,但由于 “非标量转换”,它不起作用。

vof42yt1

vof42yt11#

你可以使用按位操作。注意这取决于字节序。

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

字符串

wtlkbnrh

wtlkbnrh2#

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

字符串

mzmfm0qo

mzmfm0qo3#

byteorder crate非常适合这个,你可以指定字节序等等。

carvr3hs

carvr3hs4#

根据你想要的endianness,你可以使用from_be_bytes()from_le_bytes()from_ne_bytes()的基本类型的方法,因为Rust 1.32.0
例如:

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

字符串
Playground

相关问题