将十六进制字符串转换为数据

时间:2010-05-18 12:20:32

标签: c hex

我已经找到了很多不同的解决方案来解决这个问题,但并不是所有这些解决方案都能正常工作,而且很多解决方案看起来有点hacky和低效。基本上我有一串十六进制数据(即“55 AA 41 2A 00 94 55 AA BB BB 00 FF”),我想将其转换为原始数据。这样做的最佳方式是什么?

更新:Vicky的解决方案对我来说很有用,但是我将其更改为使用十六进制字符串,两者之间没有空格并稍微改变了样式。

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;

4 个答案:

答案 0 :(得分:2)

字符串的长度是否一样?

如果是这样的话:

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

如果不是:

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

答案 1 :(得分:1)

您是否尝试过sscanfscanf?此函数处理十六进制值并返回“原始数据”。

答案 2 :(得分:0)

#define GETBITS(a) (a < 'A' ? a - '0' : toupper(a) - 'A' + 10)

char *cur;
char data;
for (cur = buffer; *cur; cur++) {
    data = GETBITS(cur[0]) << 4 + GETBITS(cur[1]);
    cur += 2;
    printf("%c", data);
}
printf("\n");

答案 3 :(得分:0)

while(input[i]!='\0'){        
    *(temp++) = ((input[i]>='0' && input[i]<='9')?(input[i]-'0'):(input[i]-'a'+10))*16 +( (input[i+1]>='0' && input[i]<='9')?(input[i+1]-'0'):(input[i+1]-'a'+10));
         i+=2;
}