这个给你个函数,可以自己看看原理。
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 通用函数的实现 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ int Str2Hex(int InLen char *InBuffer BYTE *OutArray) { int i = 0j = 0; char tmp; if(InLen%2) return 0;//数据不为偶数,有一位十六进制数少一位数据 for( i=0j=0;i < InLen;) { if(isxdigit(InBuffer[i])==0) return 0;//判断字符是否是十六进制字符 if( InBuffer[i] >= 0x30 && InBuffer[i] <= 0x39 ) { tmp = (InBuffer[i] - 0x30)<<4; } else if( InBuffer[i] >= 0x41 && InBuffer[i] <= 0x46 ) { tmp=(InBuffer[i] - 0x37)<<4; } else if( InBuffer[i] >= 0x61 && InBuffer[i] <= 0x66 ) { tmp=(InBuffer[i] - 0x57)<<4; } i++; if( InBuffer[i] >= 0x30 && InBuffer[i] <= 0x39 ) { tmp = tmp | (InBuffer[i] - 0x30); } else if( InBuffer[i] >= 0x41 && InBuffer[i] <= 0x46 ) { tmp= tmp | (InBuffer[i] - 0x37); } else if( InBuffer[i] >= 0x61 && InBuffer[i] <= 0x66 ) { tmp =tmp | (InBuffer[i] - 0x57); } OutArray[j++] = tmp; i++; } return(j); }
char h2c(char i){ switch(i){ case '0':return 0; case '0':return 1; ... case '9':return 9; case 'a': case 'A':return 10; ... case 'f': case 'F':return 15; }}// 假设输入数据到inchar字符数组中char tmp;char out[1000]={0};int inc=0while(inchar[inc]){ if(inc%2==0){ tmp=(h2c(inchar[inc]))<<4; }else{ tmp=tmp | h2c(inchar[inc]); out[ inc/2 ] = tmp; } inc++;}
这里的112233都是字符的形式,都是ascii码,而ascii码与十六进制的数据是有一个转换关系的,通过这个关系进行计算就可以了
有关系在这里:https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii码&fromid=99077&fr=aladdin
如果是数字的话把第一个数减0x30后右移位与上第二个数减去0x30,比如12就是,串口接收到位0x31和0x32 ,那就是(1<<4)|2=0x12
如果是字母的话把第一个数减0x37后右移位与上第二个数减去0x37