我正在编写一个 Rust 程序,用于读取 I2C 总线并保存数据。当我读取 I2C 总线时,我得到十六进制值,如
0x11
、0x22
等。
现在,我只能将其作为字符串处理并按原样保存。有没有办法可以将其解析为整数?有没有内置的功能?
在大多数情况下,您希望一次解析多个十六进制字节。在这些情况下,请使用六角板条箱。
将其解析为整数
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);
}
接受的答案仅部分有效,因为
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);
}
但是我不确定这是否适用于所有架构。如果有更多知识的人可以评论或编辑答案,看看这是否总是有效,那就太好了。