This works for you
std::vector<unsigned char> unhexify(std::string const &s) {
std::vector<unsigned char> v;
for (size_t i = 0; i < s.size(); i += 2) {
auto substr = s.substr(i, 2);
auto chr_int = std::stoi(substr, nullptr, 16);
v.push_back(chr_int);
}
return v;
}

Testing
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>
std::string hexify(std::vector<unsigned char> const &v) {
std::stringstream ss;
for (auto c : v) {
// ss << std::hex << (int)c;
ss << std::setw(2) << std::setfill('0') << std::hex << (int)c;
}
return ss.str();
}
std::vector<unsigned char> unhexify(std::string const &s) {
std::vector<unsigned char> v;
for (size_t i = 0; i < s.size(); i += 2) {
auto substr = s.substr(i, 2);
auto chr_int = std::stoi(substr, nullptr, 16);
v.push_back(chr_int);
}
return v;
}
void print_vector(std::vector<unsigned char> const &v) {
// two bytes a group
for (size_t i = 0; i < v.size(); i += 1) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<unsigned char> v = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'};
// std::vector<unsigned char> v = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
std::string s = hexify(v);
std::cout << s << std::endl;
print_vector(unhexify(s));
}