У меня есть двоичный файл, который я читаю и сохраняю как шестнадцатеричные значения. Эти шестнадцатеричные значения будут использоваться для прошивки устройства, но мне нужно, чтобы шестнадцатеричные значения были сохранены как 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;
Чтобы полностью понять, что вы говорите, нам действительно нужно увидеть код, который помещает данные в ваш 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
Вуаля !, все готово.
0x3A
ЯВЛЯЕТСЯ 58
, Они представлены одинаково в двоичном виде и означают одно и то же — единственное отличие — форматирование при выводе пользователю (по умолчанию целые числа выводятся в базе 10).
Если вы пытаетесь представить 58 как 0x3A
в потоке вывода просто измените способ его вывода.
Значение есть значение, 0x3A == 58
, Там нет никакой разницы, если вы положите его в uint8_t
это точно так же. Нет ничего лучше, чем хранить его как 58 или 0x3A. Это оба заканчивается как: 00111010
,
Вы можете использовать strtol
функция для преобразования шестнадцатеричной строки в uint8_t
и используйте 16 в качестве базового номера.