Прежде всего, я не рекомендую передавать String
, а скорее &str
ссылку, потому что первая будет перемещать строку в функцию, что в этом случае не требуется.
При этом вам больше не нужно клонировать строку, просто потому что ваши две переменные &'static str
для начала.
Функция hex_to_bytes
может быть построена так:
fn hex_to_bytes(hex: &str) -> Vec<u8> {
hex.as_bytes()
.chunks(2)
.filter_map(|b| std::str::from_utf8(b).ok())
.filter_map(|s| u8::from_str_radix(s, 16).ok())
.collect()
}
ссылка на игровую площадку
Он перебирает пару байтов в строке, преобразует каждую пару в & str, который затем преобразуется в u8.
Неверные преобразования просто отбрасываются.
Это можно назвать так:
let modnum = BigNum::from_slice(hex_to_bytes(publickey_mod).as_slice())?;
let expnum = BigNum::from_slice(hex_to_bytes(publickey_exp).as_slice())?;
Наконец, если вы используете ящик openssl, есть еще более простое решение: openssl :: bn :: from_hex_str :
let modnum = BigNum::from_hex_str(publickey_mod)?;
let expnum = BigNum::from_hex_str(publickey_exp)?;