Rust是否提供了一种直接从字节(u8)数组中的ASCII数据解析整数的方法?

ide*_*n42 8 string rust

Rust有FromStr,但据我所知,这只需要Unicode文本输入.对[u8]阵列有没有相同的东西?

通过"解析"我的意思是取ASCII字符并返回一个整数,就像C atoi一样.

或者我需要......

  • 首先将u8数组转换为字符串,然后调用FromStr.
  • 打电话给libc atoi.
  • 写一个atoiRust.

在几乎所有情况下,第一个选项都是合理的,但是有些情况下文件可能非常大,没有预定义的编码...或者包含混合二进制和文本,其中最直接的读取整数作为字节.

She*_*ter 11

不,标准库没有这样的功能,但它不需要.

如注释中所述,原始字节可以转换为&strvia:

  1. str::from_utf8
  2. str::from_utf8_unchecked

这些都不会执行额外的分配.第一个确保字节是有效的UTF-8,第二个不是.每个人都应该使用经过检查的表格,直到剖析证明它是瓶颈,然后在证明安全的情况下使用未经检查的表格.

如果需要解析数据中较深的字节,则可以在转换之前获取原始字节的切片:

use std::str;

fn main() {
    let raw_data = b"123132";

    let the_bytes = &raw_data[1..4];
    let the_string = str::from_utf8(the_bytes).expect("not UTF-8");
    let the_number: u64 = the_string.parse().expect("not a number");

    assert_eq!(the_number, 231);
}
Run Code Online (Sandbox Code Playgroud)

与其他代码一样,这些行可以被提取到函数或特征中以允许重用.然而,一旦遵循这条路径,最好是研究一下旨在解析的许多伟大的箱子.如果除了文本数据之外还需要解析二进制数据,则尤其如此.

  • 解析字节在高性能应用程序中非常有用。`str::from_utf8()` 检查字符串是否是有效的 UTF-8,这会产生成本,并且如果解析器无论如何都会验证内容,那么它就是多余的。如果字节可能包含非 UTF8 内容,则 `str::from_utf8_unchecked()` 为 UB,因此它不能用于不受​​信任的数据。示例用例:使用“csv::Reader::into_byte_records()”读取大型 CSV 文件,并将字段转换为数字。 (4认同)

Mar*_*ein 7

我不知道标准库中有什么方法,但也许atoi板条箱适合你?完全披露:我是它的作者。

use atoi::atoi;

let (number, digits) = atoi::<u32>(b"42 is the answer"); //returns (42,2)
Run Code Online (Sandbox Code Playgroud)

您可以检查元组的第二个元素是否为零,以查看切片是否以数字开头。

let (number, digits) = atoi::<u32>(b"x"); //returns (0,0)
let (number, digits) = atoi::<u32>(b"0"); //returns (0,1)
Run Code Online (Sandbox Code Playgroud)