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));
}