在Rust中如何将字节数组转换为原始类型?
let barry = [0, 0]; let shorty: u16 = barry;
字符串我已经尝试过let shorty: u16 = barry as u16;,但由于 “非标量转换”,它不起作用。
let shorty: u16 = barry as u16;
vof42yt11#
你可以使用按位操作。注意这取决于字节序。
fn main() { let barry = [0, 0]; let shorty: u16 = barry[0] | (barry[1] << 8); println!("{0}", shorty); }
字符串
wtlkbnrh2#
使用原始指针也有一种不安全的方法。好处是它适用于只存在于堆栈上的任何类型。只要字节数组的格式正确,它就完全安全,因为没有指针被保留或修改。只要确保在此过程中没有可变引用存在,我建议将其 Package 到一个函数中,该函数接受对字节数组的引用和类型参数(带有Clone trait),以便借用检查器可以处理这种情况。
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. };
mzmfm0qo3#
byteorder crate非常适合这个,你可以指定字节序等等。
carvr3hs4#
根据你想要的endianness,你可以使用from_be_bytes(),from_le_bytes()或from_ne_bytes()的基本类型的方法,因为Rust 1.32.0。例如:
from_be_bytes()
from_le_bytes()
from_ne_bytes()
1.32.0
let barry = [0, 0]; let shorty = u16::from_be_bytes(barry);
字符串Playground
4条答案
按热度按时间vof42yt11#
你可以使用按位操作。注意这取决于字节序。
字符串
wtlkbnrh2#
使用原始指针也有一种不安全的方法。好处是它适用于只存在于堆栈上的任何类型。只要字节数组的格式正确,它就完全安全,因为没有指针被保留或修改。只要确保在此过程中没有可变引用存在,我建议将其 Package 到一个函数中,该函数接受对字节数组的引用和类型参数(带有
Clone
trait),以便借用检查器可以处理这种情况。字符串
mzmfm0qo3#
byteorder crate非常适合这个,你可以指定字节序等等。
carvr3hs4#
根据你想要的endianness,你可以使用
from_be_bytes()
,from_le_bytes()
或from_ne_bytes()
的基本类型的方法,因为Rust1.32.0
。例如:
字符串
Playground