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

Phi*_*ppe 1 rust

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

我不想将单个十六进制char元组转换为单个整数值.我想将包含多个十六进制char元组的字符串转换为多个整数值的切片.

rns*_*tlr 8

您可以使用十六进制包.该解码功能看起来你想要做什么:

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)


Sve*_*ach 5

您也可以自己实现十六进制编码和解码,以防避免依赖于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()如果字符串长度为奇数,该函数会出现紧急情况。我制作了一个具有更好的错误处理和在操场上可用的优化编码器的版本。

  • @Miere 这个答案的要点是提供两个简单的函数,如果您出于某种原因不想使用“hex”板条箱,可以使用这两个函数,例如减少编译时间。我不太明白为什么要在操场上写这个版本。我的实现比“hex”板条箱有什么优势吗?如果是这样,我很乐意将其放入新的板条箱中。 (2认同)