在C中的一个字节中存储2个十六进制字符

时间:2010-11-12 08:56:57

标签: c

我有一个字符串,每2个字符代表一个十六进制值,例如:

unsigned char msg[] = "04FF";

我想将“04”存储在字节中,将FF存储在另一个字节中吗?

欲望输出应与此类似,

unsigned short first_hex = 0x04; 
unsigned second_hex = 0xFF;

memcpy(hex_msg_p, &first_hex,1);
hex_msg_p++;
memcpy(hex_msg_p, &second_hex,1);
hex_msg_p++;

我的字符串很长,我真的想自动完成这个过程。

提前致谢

3 个答案:

答案 0 :(得分:4)

unsigned char msg[] = { 0x04, 0xFF };

至于从字符串转换,你需要一次读取字符串,两个字符:

usigned char result;
if (isdigit(string[i]))
  result = string[i]-'0';
else if (isupper(string[i]))
  result = string[i]-'A';
else if (islower(string[i]))
  result = string[i]-'a';

16岁,重复

答案 1 :(得分:3)

假设您的数据有效(ASCII,有效的十六进制字符,正确的长度),您应该能够做类似的事情。

unsigned char *mkBytArray (char *s, int *len) {
    unsigned char *ret;

    *len = 0;
    if (*s == '\0') return NULL;
    ret = malloc (strlen (s) / 2);
    if (ret == NULL) return NULL;

    while (*s != '\0') {
        if (*s > '9')
            ret[*len] = ((tolower(*s) - 'a') + 10) << 4;
        else
            ret[*len] = (*s - '0') << 4;
        s++;
        if (*s > '9')
            ret[*len] |= tolower(*s) - 'a' + 10;
        else
            ret[*len] |= *s - '0';
        s++;
        *len++;
    }
    return ret;
}

这将为您提供一系列无符号字符,您负责释放这些字符。它还会将len变量设置为大小,以便您可以轻松处理它。

它必须是ASCII的原因是因为ISO只强制数字字符是连续的。所有投注均为alphas。

答案 2 :(得分:2)

int first_hex, second_hex;

sscanf(msg,"%02X%02X", &first_hex, &second_hex);

重要提示:first_hexsecond_hex必须属于int类型才能像本例中一样使用。

如果我理解你,你想做以下事情:

char *pIn=msg;
char *pOut=hex_msg;
while(*pIn)
{
    int hex;
    if (*(pIn+1)==0)
    {
      // handle format error: odd number of hex digits
      ...
      break;
    }
    sscanf(pIn, "%02X", &hex);
    *pOut++=(char)hex;
    pIn+=2;
}