将十六进制字符串转换为十进制整数

问题描述 投票:0回答:2

我正在编写一个 Rust 程序,用于读取 I2C 总线并保存数据。当我读取 I2C 总线时,我得到十六进制值,如

0x11
0x22
等。

现在,我只能将其作为字符串处理并按原样保存。有没有办法可以将其解析为整数?有没有内置的功能?

parsing hex rust
2个回答
120
投票

在大多数情况下,您希望一次解析多个十六进制字节。在这些情况下,请使用六角板条箱

将其解析为整数

您想使用

from_str_radix
。它是在整数类型上实现的。

use std::i64;

fn main() {
    let z = i64::from_str_radix("1f", 16);
    println!("{:?}", z);
}

如果您的字符串实际上具有

0x
前缀,那么您将需要跳过它们。最好的方法是通过
trim_start_matches
strip_prefix
:

use std::i64;

fn main() {
    let raw = "0x1f";
    let without_prefix = raw.trim_start_matches("0x");
    let z = i64::from_str_radix(without_prefix, 16);
    println!("{:?}", z);
}

0
投票

接受的答案仅部分有效,因为

from_str_radix
在负整数上失败:

fn main() {
    let raw = "0x80000000"; // corresponds to i32::MIN
    let int = i32::from_str_radix(raw.trim_start_matches("0x"), 16).unwrap();
    assert_eq!(int, i32::MIN);
}

导致:

   Compiling playground v0.0.1 (/playground)
    Finished `release` profile [optimized] target(s) in 0.56s
     Running `target/release/playground`
thread 'main' panicked at src/main.rs:3:69:
called `Result::unwrap()` on an `Err` value: ParseIntError { kind: PosOverflow }
stack backtrace:
   0: rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::result::unwrap_failed
   3: playground::main
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

技巧是将字符串解析为无符号整数,然后将其转换回有符号整数:

fn main() {
    let raw = "0x80000000";
    let int = u32::from_str_radix(raw.trim_start_matches("0x"), 16).unwrap() as i32;
    assert_eq!(int, i32::MIN);
}

但是我不确定这是否适用于所有架构。如果有更多知识的人可以评论或编辑答案,看看这是否总是有效,那就太好了。

© www.soinside.com 2019 - 2024. All rights reserved.