Восстановление байтовой информации (uint8_t) из хекса (hex)

Для переносимости ключи шифрования представляются из массива uint8_t в шестнадцатиричном виде:

for(int i = 0; i < KEYSIZE; ++i)
    std::cout << std::setw(2) << std::setfill('0') << std::hex << static_cast<int>(PrivateKey[i]);

В силу специфики hex'а, каждый байт информации представляется двумя символами, т.е. из одного байта выходит целых два. Как корректно прочитать стринг с хексом в массив uint8_t, чтобы восстановить оригинальную байтовую информацию?

Убил около пяти часов, пытаясь осуществить задачу в виде reinterpret_cast<const uint8_t*>(publicKey.c_str()), пока не догадался, что проблема в изложенном выше феномене, а не в каких-то других частях кода. Но с ними, если что, потом ;)


Ответы (1 шт):

Автор решения: wololo

Например, можно воспользоваться std::from_chars():

#include <iostream>
#include <charconv>
#include <string>

int main()
{
    std::string str = "ff01aa00";
    
    for (std::size_t i = 0; i < str.size(); i += 2)
    {
        int val = -256;
        std::from_chars(&str[i], &str[i+2], val, 16);
        std::cout << val << " ";
    }
}

Вывод:

255 1 170 0 
→ Ссылка