接着上次写的一个字符转换。这次是互转,更便于理解。
1.CharToHex()
//功能描述:把ASCII字符转换为16进制
将两个ASCII字符转化为单个字节进行显示,即两个字节转化为一个字节。如’E’ 'B’两个字符,转化为0xEB。
void CharToHex(unsigned char *GB, int glen, unsigned char* SB, int* slen)
{
int i; //遍历输入的字符串
int a = 0;
char temp; //接收字符,用来判断是否为空格,若是则跳过
char temp1,temp2; //接收一个字节的两个字符 例如EB,则temp1='E',temp2 = 'B'
*slen = 0; //输出的16进制字符串长度
for(i=0;i<glen;i++)
{
temp = GB[i];
if(temp==' ')
continue;
if(a == 0)
temp1 = GB[i];
if(a == 1)
temp2 = GB[i];
a++;
if(a==2)
{
//第一个字符转换
if((temp1>=0x30)&&(temp1<=0x39))
temp1 -= 0x30;
else if((temp1>=0x41)&&(temp1<=0x46))//大写字母
temp1 -= 0x37;
else if((temp1>=0x61)&&(temp1<=0x66))//小写字母
temp1 -= 0x57;
else temp1 = 0xff;
//第二个字符转换
if((temp2>=0x30)&&(temp2<=0x39))
temp2 -= 0x30;
else if((temp2>=0x41)&&(temp2<=0x46))//大写字母
temp2 -= 0x37;
else if((temp2>=0x61)&&(temp2<=0x66))//小写字母
temp2 -= 0x57;
else temp2 = 0xff;
SB[*slen] = temp1*16+temp2; //转成16进制字节数据
(*slen)++;
}
}
}
2.HexToChar()
//功能描述:把16进制转换为ASCII字符
将单个字节转化为两个ASCII字符进行显示,即一个字节转化为两个字节。如0xEB,转化为’E’ 'B’两个字符。
void HexToChar(unsigned char *bHex,unsigned char *bchar,int* slen)
{
*slen = 0; //输出的字符串长度
int blen=0;
int v=0;
int m=0;
blen=strlen(*bHex);
for(int i=0;i<blen:i++)
{
v = (bHex[i]) / 16; //高位
m = (bHex[i]) % 16; //低位
// 高位转char
if((v>=0)&&(v<=9))
v += 0x30;
else if((v>=10)&&(v<=15))//大写字母
v += 0x37;
else v = 0xff;
bchar[*slen] = (unsigned char)v;//ASCII转char类型v;
(*slen)++;
// 低位转char
if((m>=0)&&(m<=9))
m += 0x30;
else if((m>=10)&&(m<=15))//大写字母
m += 0x37;
else m = 0xff;
bchar[*slen] = (unsigned char) m;//ASCII转char类型m;
(*slen)++;
}
}
代码没有测试过,只是看了网上的解释,结合自己的理解写的。
附上最全的ASCII码表: