如何将十六进制字符串转换为u8切片?

时间:2018-10-25 10:33:11

标签: rust

我有一个看起来像"090A0B0C"的字符串,我想将其转换为看起来像[9, 10, 11, 12]的切片。我最好怎么去做?

我不想将单个十六进制字符元组转换为单个整数值。我想将由多个十六进制字符元组组成的字符串转换为多个整数值的切片。

2 个答案:

答案 0 :(得分:7)

您可以使用hex板条箱。 decode函数看起来像您想要的:

extern crate hex;

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函数,该函数尚未在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);
}

答案 1 :(得分:1)

如果您想避免依赖于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
}

请注意,如果字符串长度为奇数,则decode_hex()函数会出现错误。我已经在操场上放了version with better error handling and an optimised encoder