我正在从文件中读取原始数据,并希望将其转换为整数:

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?")
}

我想在C中进行铸造,但在Rust中我该怎么做?

推荐答案

我建议使用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);
}

这将处理大小奇怪的切片,并自动推进缓冲区,以便可以读取多个值.

从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);
}

这些方法只处理固定长度的数组,以避免在数据不足时处理错误.如果你有一片,你需要convert it into an array片.

另见:

Rust相关问答推荐

为什么在Rust struct 中只允许最后一个字段具有动态大小的类型

Rust,polars CSV:有没有一种方法可以从impll BufRead(或任何字节迭代器)中读取CSV?

修改切片/引用数组

如果LET;使用布尔表达式链接(&Q);

如何获取Serde struct 的默认实例

有没有办法在Rust中配置常量变量的值?

将数组转换为HashMap的更简单方法

在铁 rust 中传递所有权

如何在嵌套的泛型 struct 中调用泛型方法?

如何在AVX2中对齐/旋转256位向量?

仅发布工作区的二进制 crate

如何使用 Bincode 在 Rust 中序列化 Enum,同时保留 Enum 判别式而不是索引?

当在lambda中通过引用传递时,为什么会出现终身/类型不匹配错误?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

由特征键控的不同 struct 的集合

在 Rust 中退出进程

有没有办法隐藏类型定义?

`if let` 只是另一种编写其他 `if` 语句的方式吗?

如何构建包含本地依赖项的 docker 镜像?

如何创建动态创建值并向它们返回borrow 的工厂?