xrl*_*xrl 15 arrays casting slice rust
我正在从文件中读取原始数据,我想将其转换为整数:
fn main() {
let buf: &[u8] = &[0, 0, 0, 1];
let num = slice_to_i8(buf);
println!("1 == {}", num);
}
pub fn slice_to_i8(buf: &[u8]) -> i32 {
unimplemented!("what should I do here?")
}
Run Code Online (Sandbox Code Playgroud)
我会在C中进行类型转换,但是我在Rust中做什么?
She*_*ter 26
我建议使用byteorder crate:
use byteorder::{BigEndian, ReadBytesExt}; // 1.2.7
fn main() {
let mut buf: &[u8] = &[0, 0, 0, 1];
let num = buf.read_u32::<BigEndian>().unwrap();
assert_eq!(1, num);
}
Run Code Online (Sandbox Code Playgroud)
这会处理奇怪大小的切片并自动推进缓冲区,以便您可以读取多个值.
从Rust 1.32开始,你也可以在整数上使用from_le_bytes
/ from_be_bytes
/ from_ne_bytes
固有方法:
fn main() {
let buf = [0, 0, 0, 1];
let num = u32::from_be_bytes(buf);
assert_eq!(1, num);
}
Run Code Online (Sandbox Code Playgroud)
这仅处理已知大小的数组,以避免在没有足够数据时处理错误.
也可以看看:
Ale*_*eev 11
我想在这里给出这个答案以提交以下附加细节:
no_std
环境中的工作解决方案。在没有外部 crate 的情况下,以下方法适用于从切片转换为整数,即使是no_std
从 Rust 1.32 开始的构建:
try_into
+ from_be_bytes
)use core::convert::TryInto;
let src = [1, 2, 3, 4, 5, 6, 7];
// 0x03040506
u32::from_be_bytes(src[2..6].try_into().unwrap());
Run Code Online (Sandbox Code Playgroud)
use core::conver::TryInto
用于no_std
构建。并使用标准箱的方法如下:use std::convert::TryInto;
。
(关于字节序,它已经得到了回答,但让我把它放在一个地方:from_le_bytes、from_be_bytes和from_ne_bytes - 根据整数在内存中的表示方式来使用它们)。
clone_from_slice
+ from_be_bytes
)let src = [1, 2, 3, 4, 5, 6, 7];
let mut dst = [0u8; 4];
dst.clone_from_slice(&src[2..6]);
// 0x03040506
u32::from_be_bytes(dst);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,整数都将等于0x03040506
。
归档时间: |
|
查看次数: |
9349 次 |
最近记录: |