代码之家  ›  专栏  ›  技术社区  ›  AriX

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

hex c
  •  2
  • AriX  · 技术社区  · 15 年前

    我已经找到了很多解决这个问题的不同方法,但并不是所有方法都有效,而且很多方法看起来有点老土,效率也不高。基本上,我有一个十六进制数据字符串(即“55 a a 41 2a 00 94 55 a a 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 回复  |  直到 9 年前
        1
  •  2
  •   Vicky    15 年前

    字符串的长度是否始终相同?

    如果是这样:

    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");
        }
    }
    
        2
  •  1
  •   ablaeul    15 年前

    你试过吗? sscanf scanf ?此函数处理十六进制值并返回“原始数据”。

        3
  •  0
  •   qrdl    15 年前
    #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");
    
        4
  •  0
  •   moffeltje    10 年前
    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;
    }