首页 > 解决方案 > 如何将非常大的十进制字符串转换为十六进制?

问题描述

let hex = "100000000000000000".as_bytes().to_hex();
// hex == "313030303030303030303030303030303030"

println!("{:x}", 100000000000000000000000u64);
// literal out of range for u64

我怎样才能得到那个值?

在 Python 中,我只需调用hex(100000000000000000000000)并得到'0x152d02c7e14af6800000'.

to_hex()来自十六进制板条箱

标签: rusthex

解决方案


需要了解 Rust 中不同数字类型的可表示值的范围。在这种特殊情况下,该值超出了 a 的限制u64,但该u128类型可以容纳该值。以下代码输出与 Python 中的示例相同的值:

fn main() {
    let my_string = "100000000000000000000000".to_string();  // `parse()` works with `&str` and `String`!
    let my_int = my_string.parse::<u128>().unwrap();
    let my_hex = format!("{:X}", my_int);
    println!("{}", my_hex);
}

检查Rust Playground

152D02C7E14AF6800000

在一般情况下,需要明确使用任意精度算术。来自什么是 Rust 中任意精度算术的最佳 crate 的一些建议?在 Reddit 上:

  • num_bigint工作稳定,没有不安全的代码。
  • ramp使用不安全且不适用于稳定的 Rust,但它更快。
  • rust-gmprug绑定到 C (GMP) 中最先进的 bigint 实现。它们速度最快,功能最多。您可能想使用其中之一。

推荐阅读