How to turn a hex string into an unsigned char array? How to turn a hex string into an unsigned char array? arrays arrays

How to turn a hex string into an unsigned char array?


This answers the original question, which asked for a C++ solution.

You can use an istringstream with the hex manipulator:

std::string hex_chars("E8 48 D8 FF FF 8B 0D");std::istringstream hex_chars_stream(hex_chars);std::vector<unsigned char> bytes;unsigned int c;while (hex_chars_stream >> std::hex >> c){    bytes.push_back(c);}

Note that c must be an int (or long, or some other integer type), not a char; if it is a char (or unsigned char), the wrong >> overload will be called and individual characters will be extracted from the string, not hexadecimal integer strings.

Additional error checking to ensure that the extracted value fits within a char would be a good idea.


You'll never convince me that this operation is a performance bottleneck.The efficient way is to make good use of your time by using the standard C library:

static unsigned char gethex(const char *s, char **endptr) {  assert(s);  while (isspace(*s)) s++;  assert(*s);  return strtoul(s, endptr, 16);}unsigned char *convert(const char *s, int *length) {  unsigned char *answer = malloc((strlen(s) + 1) / 3);  unsigned char *p;  for (p = answer; *s; p++)    *p = gethex(s, (char **)&s);  *length = p - answer;  return answer;}

Compiled and tested. Works on your example.


  • Iterate through all the characters.
    • If you have a hex digit, the number is (ch >= 'A')? (ch - 'A' + 10): (ch - '0').
      • Left shift your accumulator by four bits and add (or OR) in the new digit.
    • If you have a space, and the previous character was not a space, then append your current accumulator value to the array and reset the accumulator back to zero.