Вопрос или проблема
Я пишу программу на 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 для преобразования строки в целое число.
Шаги по конвертации шестнадцатеричной строки в десятичное целое число:
-
Удаление префикса
0x
: Для того чтобы преобразовать строку с шестнадцатеричным значением в десятичное число, сначала нужно удалить префикс. Это можно сделать с помощью методаstrip_prefix
. -
Использование метода
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);
}
Объяснение кода:
-
Функция
trimhex
: Эта функция принимает строку и удаляет префикс0x
или0X
, если он присутствует. Если префикс отсутствует, функция возвращает исходную строку. -
Основная функция
main
: В этой функции определяется переменнаяhex_value
, которая содержит шестнадцатеричное значение с префиксом. Мы вызываем функциюtrimhex
, чтобы убрать префикс, а затем используемi64::from_str_radix
для преобразования строки в десятичное целое число. Методexpect
используется для обработки возможной ошибки преобразования.
Дополнительные замечания:
- Если вы работаете с множеством шестнадцатеричных значений, рассмотрите возможность использования библиотеки
hex
, которая предоставляет удобные функции для работы с шестнадцатеричными строками. - Для обработки ошибок более изящным способом, вы можете использовать
match
для обработки результатаfrom_str_radix
.
Таким образом, используя этот подход, вы сможете преобразовывать шестнадцатеричные строки в десятичные целые числа в вашем проекте на Rust.