16进制数至字符串转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

16进制数⾄字符串转换
16进制字符串的压缩存储
对于秘钥之类的⼀些字符串,我们往往都是通过16进制数对应的字符串进⾏显⽰的。

然⽽⼀个字符串⼀般情况下要占⽤⼀个字节,⽽⼀个字节⼀般能够表⽰两个16进制数,这就造成了空间的浪费。

如0xEA,我们就可以⽤⼀个字节进⾏存储,⽽⽤'E','A'存储则需要花费两个字节。

这⾥提供了⼀个⽅法ZipStr能够将16进制字符串压缩为16进制数。

调⽤⽅法如下:
int main()
{
int i = 0;
unsigned char a[10];
char b[20] = "AbCdEf1234AbCdEf5678";
memset(a,0,sizeof(a));
ZipStr(a,b,20);
// ZipStr(a,&b[3],11);
for(i = 0;i < 10;i++)
printf("%x",a[i]); //如果想要输出⼤写的16进制数使⽤%X
printf("\r\n");
}
该调⽤⽅法中,第⼀个参数为16进制数存储位置,第⼆个参数指向需要压缩存储的字符串,第三个数是是16进制数字符串数。

当然我们也可以在字符串b的任意位置开始压缩,并且压缩任意个数的字符,就像注释掉的哪⾏⼀样。

执⾏结果如下:
对应函数源代码如下:
//将⼀个字符变成16进制数
unsigned char Str2Hex(char ch)
{
if((ch >= '0')&(ch <= '9'))
return ch - '0';
else if((ch >= 'a')&(ch <= 'f'))
return ch - 'a' + 10;
else if((ch >= 'A')&(ch <= 'F'))
return ch - 'A' + 10;
return 0;
}
//-----------------------------------------------------------------------------
// 函数功能:将16进制字符串进⾏压缩存储
//-----------------------------------------------------------------------------
// 函数说明:⽆
//-----------------------------------------------------------------------------
// 输⼊参数: dest -> 存储压缩数据的位置,src -> 需要被压缩的字符串位置
// srcNum -> 被压缩的字符串个数
// 输出参数:⽆
//-----------------------------------------------------------------------------
void ZipStr(unsigned char* dest,char* src,int srcNum)
{
int i = 0;
unsigned char temp = 0;
for(i = 0;i < srcNum;i++)
{
temp = Str2Hex(src[i]);
if(i%2)
dest[i/2] |= temp;
else
dest[i/2] = temp<<4;
}
}
这⾥为了看的更加清晰,将⼀个16进制字符串转数单独⽤⼀个函数Str2Hex写出来了。

事实上这个函数并没有在多个地⽅进⾏调⽤,因此完全可以将该函数写到ZipStr当中,这样可以省去很⼤⼀部分函数在调⽤时的开销(该函数被循环调⽤很多次)。

当然如果我们写的是C++代码,直接将这个函数声明为inline即可。

16进制数的解压
和压缩相反,当我们需要将我们的16进制数打印到窗⼝,或者通过某个字符串传递协议发送时。

我们还需要将16进制数转化为字符串,这⾥同样提供了⼀个UnzipStr⽤来进⾏上⾯函数的逆运算。

调⽤⽅法如下:
int main()
{
int i = 0;
unsigned char a[10];
char b[20] = "AbCdEf1234AbCdEf5678";
char c[21];
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
ZipStr(a,b,20);
// ZipStr(a,&b[3],11);
UnzipStr(c,a,20);
// UnzipStr(c,a+1,11);
printf("c:%s\r\n",c);
printf("a:");
for(i = 0;i < 10;i++)
printf("%x",a[i]); //如果想要输出⼤写的16进制数使⽤%X
printf("\r\n");
}
上⾯这段代码是在前⼀个代码上增加的,其中c就是a解压后的字符串。

这⾥为了⽅便打印字符串c在其后⾯⼜多加了⼀位0表⽰字符串结束。

同样,就像注释掉的部分那样,我们可以从a任意字节开始提取任意多个字符串。

代码执⾏结果如下:
对应函数源码如下:
//在⼀个字节中提取⼀个16进制数
//idx = 1表⽰提取⾼位,idx = 0表⽰提取低位
char Hex2Str(unsigned char dat,int idx)
{
char temp = 0;
if(idx)
temp = dat>>4;
else
temp = dat&0xf;
if(temp <= 9)
return temp + '0';
else
return temp - 10 + 'A'; //全部转化为⼤写
return 0;
}
//-----------------------------------------------------------------------------
// 函数功能:将16进制数解压为字符串
//-----------------------------------------------------------------------------
// 函数说明:⽆
//-----------------------------------------------------------------------------
// 输⼊参数: dest -> 存储解压后字符串的位置,src -> 需要被解压的16进制数位置
// destNum -> 被解压的字符串个数
// 输出参数:⽆
//-----------------------------------------------------------------------------
void UnzipStr(char* dest,unsigned char* src,int destNum)
{
int i = 0;
for(i = 0;i < destNum;i++)
{
if(i%2)
dest[i] = Hex2Str(src[i/2],0);
else
dest[i] = Hex2Str(src[i/2],1);
}
}
分析过程和压缩过程⼏乎⼀样这⾥不再进⾏过多介绍了。

需要注意的是这⾥只能将字符串转成⼤写的16进制数,当然转成⼩写或者通过⼀个参数进⾏控制也⼗分简单。

⽂中的源代码及对应的makefile和shell⽂件:。

相关文档
最新文档