如何将非常大的十进制字符串转换为十六进制?

时间:2018-11-17 17:32:52

标签: rust hex

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

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

我如何获得该价值?

在Python中,我只需要调用hex(100000000000000000000000)就可以得到'0x152d02c7e14af6800000'

to_hex()来自hex crate

1 个答案:

答案 0 :(得分:3)

需要注意Rust中不同数字类型可表示值的范围。在这种特定情况下,该值超出了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

在一般情况下,需要明确使用任意精度算术。 What's the best crate for arbitrary precision arithmetic in Rust?关于Reddit的一些建议:

  • num_bigint运行稳定,没有不安全的代码。
  • ramp使用不安全且无法在稳定的Rust上运行,但速度更快。
  • rust-gmprug绑定到C语言中最新的bigint实现(GMP)。它们是最快的,具有最多的功能。您可能要使用其中之一。