我使用以下函数将十六进制的值转换为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;
}
感谢大家的回复。
答案 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);