Преобразование шестнадцатеричного значения CString в массив байтов

Я пытался выполнить преобразование из CString, который содержит шестнадцатеричную строку в массив байтов и был

пока безуспешно. Я смотрел на форумах, и ни один из них, кажется, не помогает до сих пор. Есть ли функция с несколькими

строки кода, чтобы сделать это преобразование?

Мой код:

BYTE abyData[8];    // BYTE = unsigned char

CString sByte = "0E00000000000400";

Ожидая:

abyData[0] = 0x0E;
abyData[6] = 0x04; // etc.

1

Решение

Вы можете просто сожрать двух персонажей одновременно:

unsigned int value(char c)
{
if (c >= '0' && c <= '9') { return c - '0'; }
if (c >= 'A' && c <= 'F') { return c - 'A' + 10; }
if (c >= 'a' && c <= 'f') { return c - 'a' + 10; }

return -1; // Error!
}

for (unsigned int i = 0; i != 8; ++i)
{
abyData[i] = value(sByte[2 * i]) * 16 + value(sByte[2 * i + 1]);
}

Конечно 8 должен быть размером вашего массива, и вы должны убедиться, что длина строки точно в два раза больше. Проверка этой версии позволит убедиться, что каждый символ является действительной шестнадцатеричной цифрой, и сигнализирует об ошибке определенного типа, если это не так.

3

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

Как насчет чего-то вроде этого:

for (int i = 0; i < sizeof(abyData) && (i * 2) < sByte.GetLength(); i++)
{
char ch1 = sByte[i * 2];
char ch2 = sByte[i * 2 + 1];

int value = 0;

if (std::isdigit(ch1))
value += ch1 - '0';
else
value += (std::tolower(ch1) - 'a') + 10;

// That was the four high bits, so make them that
value <<= 4;

if (std::isdigit(ch2))
value += ch1 - '0';
else
value += (std::tolower(ch1) - 'a') + 10;

abyData[i] = value;
}

Замечания: Код выше не испытания.

2

Вы могли бы:

#include <stdint.h>
#include <sstream>
#include <iostream>

int main() {
unsigned char result[8];
std::stringstream ss;
ss << std::hex << "0E00000000000400";
ss >> *( reinterpret_cast<uint64_t *>( result ) );
std::cout << static_cast<int>( result[1] ) << std::endl;
}

тем не мение позаботиться о проблемах управления памятью!!!
Плюс результат в обратном порядке, как и следовало ожидать, поэтому:

result[0] = 0x00
result[1] = 0x04
...
result[7] = 0x0E
1