如何将包含十六进制数字的字符串转换为c中的十六进制格式?

时间:2012-05-16 06:39:14

标签: c string char hex

  

可能重复:
  Hex to char array in C

例如,如果我想要一个像这个"F32FC0F5EC894E16"的十六进制数字,我会将它存储在一个unsigned char变量中,如下所示:

unsigned char s[8] = {0xF3, 0x2F, 0xC0, 0xF5, 0xEC, 0x89, 0x4E, 0x16};

但是如果我在一个有这个数字的字符串中得到这个:

char a[16]="F32FC0F5EC894E16"

如何将其转换为十六进制数,并以与上述变量's'类似的方式使用它?

2 个答案:

答案 0 :(得分:2)

这项任务有一个溢出:

char a[16]="F32FC0F5EC894E16"

你没有为空终结者留出空间。 Char数组不必以null结尾,但字符串是,这是一个字符串声明。不要为使用硬编码值初始化的变量声明char数组大小,请使用[]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void hexString2byteStream (char *in, unsigned char *out, int len) {
    char *p = in;
    char byte[3] = { 0 };
    int i = 0;

    while (sscanf(p, "%2s", byte)) {
        out[i++] = strtoul(byte, NULL, 16);
        if (i == len) break;
        p += 2;
    }
}

int main(void) {
    char a[]="F32FC0F5EC894E16";
    unsigned char bs[8];
    int i;

    hexString2byteStream(a, bs, sizeof(bs));

    for (i = 0; i < 8; i++) {
        printf("%x\n", bs[i]);
    }

    return 0;
}

请注意out不是以空字符结尾的字符串。

答案 1 :(得分:0)

如果十六进制数字始终是偶数,并且字符串是大写的,则算法很容易。注意,没有对异常和错误的控制。这只是一个基本算法。

void hexCharsToBinary ( char* a, int length, char* s)
{
    int i;
    for( i=0; i< length; i++)
    {
        char mask    = (i&1)? 0xf0 : 0x0f ;
        char charVal = ((*(a+i)>='0'&&*(a+i)<='9')?*(a+i)-'0':*(a+i)-'A'+10) ;

        s[i>>1] = (s[i>>1]&mask) | charVal << ((i&1)?0:4) ;
    }

 }