如何将一片字节(&[u8])的缓冲区转换为整数?

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)

这仅处理已知大小的数组,以避免在没有足够数据时处理错误.

也可以看看:

  • 如果您只阅读单个项目,也可以使用BigEndian :: read_i32(&bytes [..]). (8认同)

Ale*_*eev 11

我想在这里给出这个答案以提交以下附加细节:

  1. 切片转换为整数的工作代码片段(两种方法)。
  2. no_std环境中的工作解决方案。
  3. 将所有内容都放在一个地方,供人们从搜索引擎到达这里。

在没有外部 crate 的情况下,以下方法适用于从切片转换为整数,即使是no_std从 Rust 1.32 开始的构建:

方法 1 ( 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_bytesfrom_be_bytesfrom_ne_bytes - 根据整数在内存中的表示方式来使用它们)。

方法 2 ( 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

  • 作为一个新手,我真的很欣赏这个答案,因为它展示了如何从切片的中间读取 (5认同)
  • @Shepmaster 很难过你这么想。我不太同意,因为我收集了所有 stackoverflow 答案中的所有信息,并决定将其放在这里以方便起见。在这个答案中,我添加了几点: 1. 在 `no_std` 环境中做什么。2.按照原始问题所述如何处理切片(不跳转到链接)。3. 没有“byteorder”该怎么办。 (3认同)
  • @Shepmaster 顺便说一句,我没有注意到这是你的回答/提问派对。;)但是您应该知道“另请参阅”注释在您的答案中并不明显,而且在答案中看到有关如何将数组转换为整数而不是将切片转换为整数的代码片段也非常令人困惑。你可能有不同的想法,我只是说一下它的样子。无论如何,你可以改进自己的答案,对吧?(PS:“点击链接不是互联网的负担”——这是你的主观观点,与我的不同) (3认同)