Как преобразовать очень большую десятичную строку в шестнадцатеричное? - PullRequest
0 голосов
/ 17 ноября 2018
let hex = "100000000000000000".as_bytes().to_hex();
// hex == "313030303030303030303030303030303030"

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

Как я могу получить это значение?

В Python я бы просто позвонил hex(100000000000000000000000) и получил '0x152d02c7e14af6800000'.

to_hex() происходит из ящика с гексагоном .

1 Ответ

0 голосов
/ 17 ноября 2018

Нужно знать о диапазоне представляемых значений для различных числовых типов в 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

В общем случае требуется явное использование арифметики произвольной точности. Несколько предложений от Каков наилучший ящик для арифметики произвольной точности в Rust? на Reddit:

  • num_bigint работает на стабильной и не имеет небезопасного кода.
  • ramp использует небезопасные и не работает на стабильном Rust, но это быстрее.
  • rust-gmp и rug связаны с современной реализацией bigint в C (GMP). Они самые быстрые и имеют большинство функций. Вы, вероятно, хотите использовать один из них.
...