Как сохранить шестнадцатеричное значение из строки в uint8_t или char без преобразования значения?

У меня есть двоичный файл, который я читаю и сохраняю как шестнадцатеричные значения. Эти шестнадцатеричные значения будут использоваться для прошивки устройства, но мне нужно, чтобы шестнадцатеричные значения были сохранены как uint8_t или char (предпочтительно uint8_t). В настоящее время значения хранятся в строке, и только один байт за раз. Что я хочу сделать, это сохранить значение как uint8_t вместо строки.

Так что, если значение std:string result является 0x3AЯ хочу ценность uint8_t flash[1] быть 0x3A, и не 58 или какое-то другое значение.

Как этого достичь?

Любая помощь приветствуется 🙂

РЕДАКТИРОВАТЬ:

Как я и ожидал и подтвердил, значения будут одинаковыми, какой бы метод я ни использовал.
Для тех, кто хочет увидеть код, генерирующий строку, вот он:

unsigned char x;
std::ifstream input(file, std::ios::binary);
input >> std::noskipws;

std::stringstream stream, str;
stream << std::hex << std::setw(2) << std::setfill('0') << (int)x;
std::string result( stream.str() );

str << result;
int value;
str >> std::hex >> value;
uint8_t data = value;

0

Решение

Чтобы полностью понять, что вы говорите, нам действительно нужно увидеть код, который помещает данные в ваш std:string result,

Однако это может помочь:

std::string result;

result += 58; // this is the same as

result += 0x3A; // this

Компилятор предполагает первый добавление является десятичным числом, потому что оно не начинается с 0 и преобразует его из десятичной в двоичную, прежде чем добавить его в строку.

Компилятор предполагает второй append — это шестнадцатеричное число, потому что оно начинается с 0x и преобразует его из шестнадцатеричного в двоичный файл перед добавлением его в строку.

В обоих случаях так же двоичное число добавляется к строке.

Теперь, чтобы поместить это в ваш массив, мы можем сделать:

uint8_t flash[2]; // big enough to our 2 chars

flash[0] = result[0]; // copy first value
flash[1] = result[1]; // copy second value

Вуаля !, все готово.

0

Другие решения

0x3A ЯВЛЯЕТСЯ 58, Они представлены одинаково в двоичном виде и означают одно и то же — единственное отличие — форматирование при выводе пользователю (по умолчанию целые числа выводятся в базе 10).

Если вы пытаетесь представить 58 как 0x3A в потоке вывода просто измените способ его вывода.

0

Значение есть значение, 0x3A == 58, Там нет никакой разницы, если вы положите его в uint8_t это точно так же. Нет ничего лучше, чем хранить его как 58 или 0x3A. Это оба заканчивается как: 00111010,

Вы можете использовать strtol функция для преобразования шестнадцатеричной строки в uint8_t и используйте 16 в качестве базового номера.

0
По вопросам рекламы [email protected]