今天在写代码的时候遇到一个需求:为了与同一产品中的其它设备统一,上位机要求处理字符串,而不是数组。我们都知道在处理数据的时候数组方便,不过考虑到兼顾别的设备(没错我说的就是TI430做的RFID读卡设备,跟上位机之间的协议传递的是字符串/大笑),就尝试了将16进制的数据改为字符串,也就是0xAB,改成“AB”。。。虽然看上去没什么用。
原先的数据类型是uint8_t,熟悉单片机的都知道这个的含义,其实也就是unsigned char ,说到底还是个char,但偏偏要求表示成’A”B’两个char,然后我内心当然是拒绝的,但没有办法,还是开动脑筋实现了这个不合理的需求。代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uint8_t;
int main()
{
int i = 0;
uint8_t data[5]={0x12,0x34,0x56,0xab,0xef};
uint8_t str[10];
uint8_t dst[10];
for(i = 0; i<5;i++)
{
str[2*i] = data[i]>>4;
str[2*i+1] = data[i]&0xf;
}
for(i = 0; i<10;i++)
{
sprintf(&dst[i],"%X/n",str[i]);
}
for(i = 0; i<10;i++)
{
printf("%c\n",dst[i]);
}
return 0;
}
思路就是使用sprintf函数来把参数3的数组以参数2的格式写在参数1的地方去,sprintf函数有点过时了,它有一个更加安全的兄弟叫做sprintf_s,但是我用的那个IDE可能太老了(IAR8.10,呵呵哒了),不支持他兄弟。
有一个警告是参数1的类型不能是无符号的,
warning: pointer targets in passing argument 1 of ‘sprintf’ differ in signedness [-Wpointer-sign]|
但是功能实现了,就没再折腾它,反正也没人看,找到解决办法时再更。
想改成小写字母的话,可以把第二个参数改为%x.
下面是运行结果,IDE是code::Blocks 16.01,GNU GCC Compiler