注意十六进制跟十六进制的字符的概念?????
机器码跟字符串的概念???????
如:机械:" #Eg壂惋" 转化后的输出十六进制结果为23456789ABCDEF00
字符串转变成十六进制的字符串 "55ff" 0x55 0xff
十六进制的字符串转变成字符串 0x55 0xff "55ff"
//hex更便于程序员自身识别,而asc更便于计算机识别
/*******
十六进制转换成ASCII
将数据好更好地呈现给机器
如:23456789ABCDEF 转化后的输出结果为 " #Eg壂惋"
********/
int
HexToAsc(char *pDst, char *pSrc, int nSrcLen)
{
for(int i=0;
i<nSrcLen; i+=2)
{
// 输出高4位
if(*pSrc>=‘0‘ &&
*pSrc<=‘9‘)
{
*pDst = (*pSrc - ‘0‘) << 4;
}
else
if(*pSrc>=‘A‘ && *pSrc<=‘F‘)
{
*pDst = (*pSrc - ‘A‘ +
10) << 4;
}
else
{
*pDst = (*pSrc - ‘a‘ + 10)
<< 4;
}
pSrc++;
// 输出低4位
if(*pSrc>=‘0‘ &&
*pSrc<=‘9‘)
{
*pDst |= *pSrc - ‘0‘;
}
else
if(*pSrc>=‘A‘ && *pSrc<=‘F‘)
{
*pDst |= *pSrc - ‘A‘ +
10;
}
else
{
*pDst |= *pSrc - ‘a‘ + 10;
}
pSrc++;
pDst++;
}
// 返回目标数据长度
return nSrcLen / 2;
}
/*******
ASCII转换成十六进制
将机器返回的字节码数据更友好地呈现给程序员识别,所以需要将asc转换为hex的形式
如:机械:" #Eg壂惋" 转化后的输出结果为23456789ABCDEF00
********/
int
AscToHex(char*pDst,char *pSrc,int SrcLen)
{
/*符串”0123456789ABCDEF”
该字符串表示的是十六进制的值,每个元素相当于4个bit的值,
所以每两位相当于一个byte。该字符串每个元素的取值范围为0~9和A~F,
总共16个值,即16进制的16个数字*/
const
char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
for(int i=0;
i<SrcLen; i++)
{
*pDst++ = tab[*((unsigned char*)pSrc) >>
4]; // 输出低4位
*pDst++ = tab[*((unsigned char*)pSrc) & 0x0f]; //
输出高4位
pSrc++;
}
// 输出字符串加个结束符
*pDst = ‘\0‘;
// 返回目标字符串长度
return SrcLen * 2;
}
//字符串转变成十六进制的字符串 "55ff" 0x55 0xff
int AscToHex(char *Dest,char *Src,int
SrcLen)
{
int i;
for ( i = 0; i < SrcLen / 2; i ++
)
{
sscanf(Src + i * 2,"%02X",(unsigned char
*)&Dest[i]);
}
return 0;
}
//十六进制的字符串转变成字符串 0x55 0xff "55ff"
int HexToAsc(char *Dest,char *Src,int
SrcLen)
{
int i;
for ( i = 0; i < SrcLen; i ++
)
{
sprintf(Dest + i * 2,"%02X",(unsigned
char)Src[i]);
}
Dest[i * 2] = 0;
return 0;
}