前段时间做了一个的项目,涉及到串口通信,通信报文格式为0x01 0x22 0xdf ...... 即需要将十进制数据转化成十六进制数据,并按照成对排列的格式组合在一起。进制转换只需循环执行“求商取余”的原则即可,但转换后的十六进制数据都是单个char字符,这就需要将字符两两合并。C/C++实现代码如下:
#include <stdio.h>
#include <stdint.h>
/*将多个char十六进制字符拼接成一个char字符(如0和a拼接成0x0a)*/
unsigned char catChar2Hex(unsigned char hByte,unsigned char lByte)
{
unsigned char ucTmp = 0x00;
unsigned char hight;
unsigned char low;
if ( (hByte >= 'A') && (hByte <= 'F') )
{
hight = hByte - 'A' + 10;
}
else if (hByte >= 'a' && hByte<='f')
{
hight = hByte - 'a' + 10;
}
else if (hByte >= '0' && hByte <= '9')
{
hight = hByte - '0';
}
else
{
ucTmp = 0xff;
}
if ( (lByte >= 'A') && (lByte <= 'F') )
{
low = lByte - 'A' + 10;
}
else if (lByte >= 'a' && lByte<='f')
{
low = lByte - 'a' + 10;
}
else if (lByte >= '0' && lByte <= '9')
{
low = lByte - '0';
}
else
{
ucTmp = 0xff;
}
ucTmp = (hight<<4) | (low << 0);//高位左移4位,低位不移动,组成一个8位十六进制字符
return ucTmp;
}
int main()
{
int i,j;
unsigned char catChar2Hex_get;
unsigned char Date[2] = {'a','9'};
catChar2Hex_get = catChar2Hex(Date[0],Date[1]);
printf("传入的两个字符为:");
for(i=0; i<2; i++)
{
printf("%c ",Date[i]);
}
printf("\r\n");
printf("合并成一个字符为:0x%02x \n",int(catChar2Hex_get));
}
运行结果如下:
此处主要参考这位博主的文章,但这篇文章里的第13行和29行撰写错误,会导致大于10的字符合并错误。
https://blog.youkuaiyun.com/xsq5956/article/details/80524114