chex

Convert Hexadecimal String to Data


I have found a whole lot of different solutions to this problem, but not all of them work, and a lot of them seem somewhat hacky and inefficient. Basically I have a string of hexadecimal data (i.e. "55 AA 41 2A 00 94 55 AA BB BB 00 FF") which I would like to convert to raw data. What is the best way to do this?

UPDATE: Vicky's solution worked great for me, but I changed it to work with hexadecimal strings that don't have spaces in between and changed the style a bit.

int i = 0;
char *hexString = "55AA412A009455AABBBB00FF"
char *hexPtr = hexString;
unsigned int *result = calloc(strlen(hexString)/2 + 1, sizeof *result);

while (sscanf(hexPtr, "%02x", &result[i++])) {
    hexPtr += 2;
    if (hexPtr >= hexString + strlen(hexString)) break;
}

return result;

Solution

  • Is the string always the same length?

    If so:

    char *buf = "55 AA 41 2A 00 94 55 AA BB BB 00 FF";
    sscanf(buf, "%x %x %x [repeat as many times as necessary]", &a, &b, &c [etc]);
    

    If not:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main (int argc, char ** argv)
    {
        char *buf = "55 AA 41 2A 00 94 55 AA BB BB 00 FF";
        char *p = buf;
        int i = 0, j;
        unsigned int *result = calloc(strlen(buf)/3 + 1 * sizeof(int), 1);
    
        if (result)
        {
            while (sscanf(p, "%02x", &result[i++]))
            {
                 p += 3;
                if (p > buf + strlen(buf))
                {
                 break;
                }
            }
    
            printf("%s\n", buf);
    
            for (j = 0; j < i; j++)
            {
                printf("%02X ", result[j]);
            }
    
            printf("\n");
        }
    }