我有一个这样的字符串 "090A0B0C"
,我想要将它转换成类似于 [9, 10, 11, 12]
的切片。最好的方法是什么?
我不想将单个十六进制字符元组转换为单个整数值。我想将由多个十六进制字符元组组成的字符串转换为多个整数值的切片。
我有一个这样的字符串 "090A0B0C"
,我想要将它转换成类似于 [9, 10, 11, 12]
的切片。最好的方法是什么?
我不想将单个十六进制字符元组转换为单个整数值。我想将由多个十六进制字符元组组成的字符串转换为多个整数值的切片。
如果你想避免依赖于hex
创建,你也可以自己实现十六进制编码和解码:
use std::{fmt::Write, num::ParseIntError};
pub fn decode_hex(s: &str) -> Result<Vec<u8>, ParseIntError> {
(0..s.len())
.step_by(2)
.map(|i| u8::from_str_radix(&s[i..i + 2], 16))
.collect()
}
pub fn encode_hex(bytes: &[u8]) -> String {
let mut s = String::with_capacity(bytes.len() * 2);
for &b in bytes {
write!(&mut s, "{:02x}", b).unwrap();
}
s
}
decode_hex()
函数会出现错误。我已经在playground上提供了一个具有更好的错误处理和优化编码器的版本。hex
crate,例如为了减少编译时间,这些函数可以使用。我不太清楚为什么我在 playground 上写了版本。我的实现是否比 hex
crate 有任何优势?如果有的话,我很乐意将其放入一个新的 crate 中。 - Sven Marnachencode_hex
有一个未处理的来自write!
宏的Result
。 - HerohtarOk(())
。我添加了 .unwrap()
以明确表示这一点。 - Sven Marnach你可以使用hex crate实现。 decode函数看起来就是你想要的:
fn main() {
let input = "090A0B0C";
let decoded = hex::decode(input).expect("Decoding failed");
println!("{:?}", decoded);
}
以上内容将打印出[9, 10, 11, 12]
。请注意,decode
返回一个分配在堆上的Vec<u8>
,如果您想解码成数组,则需要使用decode_to_slice
函数。fn main() {
let input = "090A0B0C";
let mut decoded = [0; 4];
hex::decode_to_slice(input, &mut decoded).expect("Decoding failed");
println!("{:?}", decoded);
}
或者使用FromHex
特性:
use hex::FromHex;
fn main() {
let input = "090A0B0C";
let decoded = <[u8; 4]>::from_hex(input).expect("Decoding failed");
println!("{:?}", decoded);
}
hex
包。我之前看到了你的答案,今天又帮了我一次忙! - Nico Serrano