Как я могу преобразовать шестнадцатеричную строку в срез u8? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть строка, которая выглядит следующим образом "090A0B0C", и я хотел бы преобразовать ее в фрагмент, который выглядит примерно так [9, 10, 11, 12].Как мне лучше всего это сделать?

Я не хочу преобразовывать один шестнадцатеричный набор символов в одно целочисленное значение.Я хочу преобразовать строку, состоящую из нескольких шестнадцатеричных кодов, во фрагмент нескольких целочисленных значений.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы также можете реализовать шестнадцатеричное кодирование и декодирование самостоятельно, если хотите избежать зависимости от 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() вызывает панику, если длина строки равнастранный.Я сделал версию с улучшенной обработкой ошибок и оптимизированным кодером , доступную на игровой площадке.

0 голосов
/ 25 октября 2018

Для этого вы можете использовать ящик 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...