rust - 如何将非常大的十进制字符串转换为十六进制?
问题描述
let hex = "100000000000000000".as_bytes().to_hex();
// hex == "313030303030303030303030303030303030"
println!("{:x}", 100000000000000000000000u64);
// literal out of range for u64
我怎样才能得到那个值?
在 Python 中,我只需调用hex(100000000000000000000000)
并得到'0x152d02c7e14af6800000'
.
to_hex()
来自十六进制板条箱。
解决方案
需要了解 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);
}
152D02C7E14AF6800000
在一般情况下,需要明确使用任意精度算术。来自什么是 Rust 中任意精度算术的最佳 crate 的一些建议?在 Reddit 上:
num_bigint
工作稳定,没有不安全的代码。ramp
使用不安全且不适用于稳定的 Rust,但它更快。rust-gmp
并rug
绑定到 C (GMP) 中最先进的 bigint 实现。它们速度最快,功能最多。您可能想使用其中之一。
推荐阅读
- php - 如果菜单有子菜单,如何将项目添加到 wp_nav_menu
- node.js - NodeJS:获取 RangeError:超出最大调用堆栈大小
- java - 如何从属性文件加载 ClientCredentialsResourceDetails 所需的参数
- xamarin.forms - Azure AD (ADAL) 登录屏幕丢失在 Android Only-XamarinForms.Android 的设备方向上输入的用户电子邮件
- javascript - 使用循环从多维数组中获取数据
- php - 使用外部 ID 时未注册用户/无法设置外部 ID
- java - 使用比较器接口和 lambda 表达式对整数数组进行排序
- c++ - 将函数作为参数传递给模板函数问题
- android - 是否可以在 Android Studio 模拟器设备中从 Google Play 商店免费下载付费应用程序?
- c - C 上的中断处理程序在一个中断后不起作用