c++stringhex

Converting a hex string to a byte array


What is the best way to convert a variable length hex string e.g. "01A1" to a byte array containing that data.

i.e converting this:

std::string = "01A1";

into this

char* hexArray;
int hexLength;

or this

std::vector<char> hexArray;

so that when I write this to a file and hexdump -C it I get the binary data containing 01A1.


Solution

  • This ought to work:

    int char2int(char input)
    {
      if(input >= '0' && input <= '9')
        return input - '0';
      if(input >= 'A' && input <= 'F')
        return input - 'A' + 10;
      if(input >= 'a' && input <= 'f')
        return input - 'a' + 10;
      throw std::invalid_argument("Invalid input string");
    }
    
    // This function assumes src to be a zero terminated sanitized string with
    // an even number of [0-9a-f] characters, and target to be sufficiently large
    void hex2bin(const char* src, char* target)
    {
      while(*src && src[1])
      {
        *(target++) = char2int(*src)*16 + char2int(src[1]);
        src += 2;
      }
    }
    

    Depending on your specific platform there's probably also a standard implementation though.