Преобразование шестнадцатеричной строки в десятичное целое число

Вопрос или проблема

Я пишу программу на Rust, которая считывает данные с шины I2C и сохраняет их. Когда я читаю шину I2C, я получаю шестнадцатеричные значения, такие как 0x11, 0x22 и т. д.

В данный момент я могу обрабатывать это только как строку и сохранять так, как есть. Есть ли способ преобразовать это в целое число? Есть ли встроенная функция для этого?

В большинстве случаев вам нужно разобрать более одного шестнадцатеричного байта сразу. В таких случаях используйте библиотеку hex.

преобразовать это в целое число

Вы хотите использовать from_str_radix. Это реализовано для целочисленных типов.

use std::i64;

fn main() {
    let z = i64::from_str_radix("1f", 16);
    println!("{:?}", z);
}

Если ваши строки действительно имеют префикс 0x, то вам нужно будет пропустить его. Лучший способ сделать это — использовать trim_start_matches или strip_prefix:

use std::i64;

fn main() {
    let raw = "0x1f";
    let without_prefix = raw.trim_start_matches("0x");
    let z = i64::from_str_radix(without_prefix, 16);
    println!("{:?}", z);
}

strip_prefix уже упоминался ранее и на самом деле не так уж сложен в использовании, как может показаться на первый взгляд. Его можно вложить, и он делает ожидаемое. Ссылка на Playground


fn trimhex(s: &str) -> &str {
    s.strip_prefix("0x").unwrap_or(s.strip_prefix("0X").unwrap_or(s))
}

fn main() {
    println!("{}", trimhex("0123"));
    println!("{}", trimhex("0x01"));
    println!("{}", trimhex("0X23"));
    // только первый ведущий 0[xX] удаляется
    println!("{}", trimhex("0x0x45"));
    println!("{}", trimhex("0x0X67"));
    println!("{}", trimhex("0X0x89"));
    println!("{}", trimhex("0X0Xab"));
}

Ответ или решение

Конвертация шестнадцатеричной строки в десятичное целое число в языке Rust можно выполнить с использованием встроенных методов. Если вы получаете значения в формате, например, 0x11, 0x22, и т. д., то вам необходимо избавиться от префикса 0x, чтобы корректно использовать метод из библиотеки стандартных типов Rust для преобразования строки в целое число.

Шаги по конвертации шестнадцатеричной строки в десятичное целое число:

  1. Удаление префикса 0x: Для того чтобы преобразовать строку с шестнадцатеричным значением в десятичное число, сначала нужно удалить префикс. Это можно сделать с помощью метода strip_prefix.

  2. Использование метода from_str_radix: После того как префикс удалён, можно использовать метод from_str_radix, чтобы преобразовать строку в число.

Вот пример кода, который демонстрирует данный процесс:

use std::i64;

fn trimhex(s: &str) -> &str {
    s.strip_prefix("0x").unwrap_or(s.strip_prefix("0X").unwrap_or(s))
}

fn main() {
    let hex_value = "0x1f";

    // Удаляем префикс
    let without_prefix = trimhex(hex_value);

    // Преобразуем строку в десятичное целое число
    let decimal_value = i64::from_str_radix(without_prefix, 16).expect("Ошибка при преобразовании");

    // Печатаем результат
    println!("Десятичное значение: {}", decimal_value);
}

Объяснение кода:

  1. Функция trimhex: Эта функция принимает строку и удаляет префикс 0x или 0X, если он присутствует. Если префикс отсутствует, функция возвращает исходную строку.

  2. Основная функция main: В этой функции определяется переменная hex_value, которая содержит шестнадцатеричное значение с префиксом. Мы вызываем функцию trimhex, чтобы убрать префикс, а затем используем i64::from_str_radix для преобразования строки в десятичное целое число. Метод expect используется для обработки возможной ошибки преобразования.

Дополнительные замечания:

  • Если вы работаете с множеством шестнадцатеричных значений, рассмотрите возможность использования библиотеки hex, которая предоставляет удобные функции для работы с шестнадцатеричными строками.
  • Для обработки ошибок более изящным способом, вы можете использовать match для обработки результата from_str_radix.

Таким образом, используя этот подход, вы сможете преобразовывать шестнадцатеричные строки в десятичные целые числа в вашем проекте на Rust.

Оцените материал
Добавить комментарий

Капча загружается...