在C中将Ascii数转换为十六进制

时间:2013-12-05 09:36:45

标签: c++ c embedded hex ascii

我使用以下函数将十六进制的值转换为ASCII:

void hex_to_ascii(unsigned char* buf, unsigned char number)
{
  int i;

  sprintf(  buf, "%03d", number );

  printf("\nNumber in Ascii: ");
  for( i=0; i< 3; i++)
     printf("%#04x ", *(buf+i));

  printf("\n");
  return;
}

e.g。如果十六进制值为0xff,则函数生成0x32 0x35 0x35,这是255的Ascii表示。

现在我想扭转手术。我想要一个可以传递三个字节(3个数组)的函数来生成十六进制值。

即。我们通过0x32 0x35 0x34并生成0xFE.

你能帮我解决这个问题吗?对于嵌入式系统,值不是通过通信缓冲区获得的类型。

非常感谢。

编辑:

我写了这个,似乎有用......

unsigned char ascii_to_hex(unsigned char* buf)
{
   unsigned char hundred, ten, unit, value;

   hundred = (*buf-0x30)*100;
   ten = (*(buf + 1)-0x30)*10;
   unit = *(buf+2)-0x30;     

   value = (hundred + ten + unit);
   printf("\nValue: %#04x \n", value);

   return value; 
}

感谢大家的回复。

2 个答案:

答案 0 :(得分:1)

你可以使用stdlib的atoi()函数将字符串转换为整数:

char str[] = {0x32, 0x35, 0x34, 0x00};
int integer = atoi(str);
printf("%x\n", integer);

然后你可以printf()那个整数为hex / dec或者其他什么。 如果这对您的需求来说太简单了,那么更强大的替代方法是使用sscanf()

如果从通信缓冲区获取这些整数字符串,那么您可能希望首先将缓冲区拆分为单独的数字(例如,它们可能用空格分隔)。在C中执行此操作的一种简单方法是使用strtok()。

编辑: 此编辑是为了响应您添加到问题中的代码。我无法对你的问题发表评论,因为我没有足够的声誉! 您添加的代码已损坏。它仅在提供三位数字符串时才起作用,例如“001”,“255”。如果提供了不同数量的数字,它将读取超出字符串结尾并产生垃圾输出,尝试“1”或“14”或“12314”。

答案 1 :(得分:0)

您需要在基数10中构建一个数字,考虑到所有数字都存储在char*buf中,如下所示:

//assumtions: n - number of digits
//            digits are ordered MSD first -> buff[0] contains the most significant digit.
 for(i=0;i<n;i++)
    {
       number += buf[n-i-1]*pow(10,i); //number+=digit*10^i
    }

    printf("%x\n", number);