今天碰到一个需求:将16进制的数组转成对应的字符串显示出来,举例:
16进制数组:Hex[4] = {0xc1,0x12,0xe4,0x58};
显示为: “c1 12 e4 58”
一开始使用sprintf没有转出来,后来百度了一下,使用位运算可以做出来,原文章链接点击此处
Ascii表链接:ASCII表
整理了一下代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char UChar;
UChar HexToAscii(UChar c){
if(c > 9){
return (c+55); // 16进制 0A 对应的ascii 'A',两者相差55 -- 可以比照ascii表理解
}else{
return (c+48); // 16进制 01 对应的ascii '1' 两者相差48 -- 可以比照ascii表理解
}
}
UChar hexData[6] = {0xc1,0x12,0xe4,0x58,0xba,0x76};
int main(){
UChar temp;
UChar data[32] = {0};
for(int i = 0; i < sizeof(hexData); i++){
temp = hexData[i] & 0xf0; // 取16进制数高位放到 HexToAscii 函数中转成字符
*(data + i*3) = HexToAscii(temp >> 4);
temp = hexData[i] & 0x0f; // 取16进制数低位放到 HexToAscii 函数中转成字符
*(data + i*3 + 1) = HexToAscii(temp);
*(data + i*3 + 2) = ' '; // 添加空格进行区分
}
printf("string is %s.\n",data);
return 0;
}
打印如下:
string is C1 12 E4 58 BA 76 .
具体不再展开解释,看代码注释就能明白。