【问题标题】:Convert Hexadecimal String to Data将十六进制字符串转换为数据
【发布时间】:2010-05-18 12:20:31
【问题描述】:

我已经找到了很多不同的解决方案来解决这个问题,但并不是所有的解决方案都有效,而且很多解决方案看起来有些笨拙和效率低下。基本上我有一串十六进制数据(即“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;

【问题讨论】:

  • 您能否简要说明一下您尝试过的几种方法以及该代码应该适合什么类型的上下文?
  • (也许不是最好的,但肯定是最短的;)Code golf - hex to (raw) binary conversion的可能副本
  • zaf,这正是我想要的,抱歉我之前没看到。我想这在某种程度上是一个副本。
  • 没有必要将&result[i++] 转换为(unsigned int *) - 它已经具有该类型。此外,您没有为 result 分配足够的空间 - 您需要将 calloc 调用中的最后一个 , 1) 替换为 sizeof *result。

标签: c hex


【解决方案1】:

字符串总是一样长吗?

如果是这样:

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

【讨论】:

  • %02x 转换说明符需要一个指向 unsigned int 的指针,但您传递给它的是一个指向 unsigned char 的指针。这会导致未定义的行为(实际上,您的答案将在非小端的机器上产生不正确的结果,并在具有严格对齐要求的机器上崩溃)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    #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】:
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-01-31
        • 2018-01-22
        • 1970-01-01
        • 2013-02-07
        • 2014-03-19
        • 2013-11-23
        • 2015-11-29
        相关资源
        最近更新 更多