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.
- If you have a hex digit, the number is