#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iomanip>

void test1(const std::string &test)
{
    size_t numbytes = test.size() / 2;

    std::vector<unsigned char> bytearray;
    bytearray.reserve(numbytes);
    
    for (size_t w = 0, x = 0; w < numbytes; ++w, x += 2) {
        unsigned char b;
    
        char c = test[x];
        if ((c >= '0') && (c <= '9'))
            b = (c - '0');
        else if ((c >= 'A') && (c <= 'F'))
            b = 10 + (c - 'A');
        else if ((c >= 'a') && (c <= 'f'))
            b = 10 + (c - 'a');
        else {
            // error!
            break;
        }
    
        b <<= 4;
    
        c = test[x+1];
        if ((c >= '0') && (c <= '9'))
            b |= (c - '0');
        else if ((c >= 'A') && (c <= 'F'))
            b |= 10 + (c - 'A');
        else if ((c >= 'a') && (c <= 'f'))
            b |= 10 + (c - 'a');
        else {
            // error!
            break;
        }
    
        bytearray.push_back(b);
    }
    
    std::cout << "1: ";
    for(auto b : bytearray)
        std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)b << " ";
    std::cout << std::endl;
}

void test2(const std::string &test)
{
    size_t numbytes = test.size() / 2;

    std::vector<unsigned char> bytearray;
    bytearray.reserve(numbytes);
    
    for(size_t w = 0, x = 0; w < numbytes; ++w, x += 2)
    {
        std::istringstream iss(test.substr(x, 2));
        unsigned short b;

        if (!(iss >> std::hex >> b)) {
            // error!
            break;
        }

        bytearray.push_back(static_cast<unsigned char>(b));
    }
    
    std::cout << "2: ";
    for(auto b : bytearray)
        std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)b << " ";
    std::cout << std::endl;
}

int main()
{
    std::string test = "48656c6c6f20576f726c64"; 
    std::cout << test << std::endl;
    test1(test);
    test2(test);
    return 0;
}