gpt4 book ai didi

rust - 使用rug::Integer::parse()将&[u8]或&str解析为rug::Integer

转载 作者:行者123 更新时间:2023-12-03 11:41:55 25 4
gpt4 key购买 nike

rug::Integer::parse 与字符串文字(&'static str)一起使用,如下所示:

use rug::{Integer, Assign};

fn main() {
let n = "12";
let mut id = Integer::new();
id.assign(Integer.parse(n).unwrap()); // This works
}

但是,它不适用于 &str:
use rug::{Integer, Assign};
use std::str;

fn main() {
let n = vec![0u8, 1, 2];
let s = str::from_utf8(&n).unwrap();
let mut id = Integer::new();
id.assign(Integer.parse(s).unwrap()); // This works
}

或使用 &[u8]:
use rug::{Integer, Assign};

fn main() {
let n = vec![0u8, 1, 2];
let mut id = Integer::new();
id.assign(Integer.parse(&n[..]).unwrap()); // This works
}

在后两种情况下,错误为:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntegerError { kind: InvalidDigit }

如果 parse应该与 &str&[u8]一起使用,则不确定发生了什么。

最佳答案

rug::Integer::parse使用UTF-8字符串。当它接受&[u8]时,切片中的整数将解析为UTF-8字符串的字节。

字符串“12”作为字节数组是[49, 50],因此,如果要这样解析,则必须使用这些字节。

use rug::{Assign, Integer};
use std::str;

fn main() {
let n = vec![49, 50];
let s = str::from_utf8(&n).unwrap();
let mut id = Integer::new();
id.assign(Integer::parse(s).unwrap());

assert_eq!(id, Integer::from(12));
}

Rust游乐场没有 rug crate ,因此 here's a simplified version.

使用 [0, 1, 2]直接解析 Integer::parse是没有意义的,因为与 0 12对应的UTF-8代码点不是数字。相反,它们是 the three non-printable characters NULSOHSTX

另一方面,如果您有一个以256位为基数的数组,并且想要将其转换为 rug::Integer,请考虑使用 rug::Integer::from_digits rug::Integer::assign_digits 。通过使用其他整数类型,您可以获得其他基数。例如,使用 u16数字将被解释为基本 2^16

use rug::{integer::Order, Integer};

fn main() {
let n = vec![0u8, 1, 2];
let id = Integer::from_digits(&n[..], Order::Msf);
assert_eq!(id, Integer::from(0 * 256 * 256 + 1 * 256 + 2));
}

最后,如果您有一个以10位为基数的数组,则可以先转换为字符串,然后再使用 rug::Integer::from_str_radix .rug::Integer API中似乎没有任何直接转换,因此您必须自己使用算术来实现操作或使用这种不理想的解决方案。
use rug::Integer;

fn main() {
let n = vec![0_u8, 1, 2];
let n_str: String = n.iter().map(|d| d.to_string()).collect();
assert_eq!(n_str, "012");

let id = Integer::from_str_radix(&n_str, 10).unwrap();
assert_eq!(id, Integer::from(12));
}

关于rust - 使用rug::Integer::parse()将&[u8]或&str解析为rug::Integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62293363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com