Это мое предлагаемое решение. Я использовал его для кодирования GUID в виде байтового массива. Он должен достичь более высокой производительности, чем printf
для всех символов.
typedef unsigned char byte;
std::map<char, byte> char2hex =
{
{'0', 0x0},
{'1', 0x1},
{'2', 0x2},
{'3', 0x3},
{'4', 0x4},
{'5', 0x5},
{'6', 0x6},
{'7', 0x7},
{'8', 0x8},
{'9', 0x9},
{'a', 0xa},
{'b', 0xb},
{'c', 0xc},
{'d', 0xd},
{'e', 0xe},
{'f', 0xf}
};
void convertToBytes(const string &chars, byte bytes[])
{
for (size_t i = 0; i < chars.length() / 2; i++) {
byte b1 = (byte)(char2hex[chars[2*i]] << 4);
byte b2 = char2hex[chars[2*i+1]];
byte f = b1 | b2;
*(bytes + i) = f;
}
}
Помните, что два символа ascii составляют один байт, поэтому для каждой пары символов мне нужно преобразовать первый символ в байт, затем сдвинуть его на 4 бита, а затем или со следующим символом, чтобы получить один байт.