我有一个看起来像这样的字符串,"090A0B0C"我想将其转换为看起来像这样的切片[9, 10, 11, 12].我最好怎么做呢?
我不想将单个十六进制char元组转换为单个整数值.我想将包含多个十六进制char元组的字符串转换为多个整数值的切片.
extern crate hex;
fn main() {
let input = "090A0B0C";
let decoded = hex::decode(input).expect("Decoding failed");
println!("{:?}", decoded);
}
Run Code Online (Sandbox Code Playgroud)
以上将打印[9, 10, 11, 12].请注意,如果要解码为要使用该函数的数组,则decode返回已分配的堆Vec<u8>,该decode_to_slice函数尚未在crates.io或FromHex特征上发布:
extern crate hex;
use hex::FromHex;
fn main() {
let input = "090A0B0C";
let decoded = <[u8; 4]>::from_hex(input).expect("Decoding failed");
println!("{:?}", decoded);
}
Run Code Online (Sandbox Code Playgroud)
您也可以自己实现十六进制编码和解码,以防避免依赖于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);
}
s
}
Run Code Online (Sandbox Code Playgroud)
请注意,decode_hex()如果字符串长度为奇数,该函数会出现紧急情况。我制作了一个具有更好的错误处理和在操场上可用的优化编码器的版本。
| 归档时间: |
|
| 查看次数: |
2248 次 |
| 最近记录: |