由于经常会用到Str和Hex的互转,所以直接将这两个功能封装成了2个函数,方便使用。写在这里,也便于日后查找使用。
#include <string.h>
/*************************************************************
功 能:将单个字符转换为十六进制数据,例如 'A' -- 0xA, 'C' -- '0xC'
参 数:Arg1:chValue, 待转化的原始字符值;
参 数:Arg2:lpRes, 保留结果的字符指针;
返回值:转换成功返回 true,否则返回 false。
*************************************************************/
bool Char2Hex(unsigned char chValue, unsigned char *lpRes)
{
bool bRet = true;
if(!lpRes)
{
bRet = false;
goto SAFE_EXIT;
}//end if(!lpRes)
if(chValue >= '0' && chValue <= '9')
{
*lpRes = chValue - '0';
goto SAFE_EXIT;
}//end if(chValue >= '0' && chValue <= '9')
else if(chValue >= 'A' && chValue <= 'F')
{
*lpRes = chValue - 'A' + 10;
goto SAFE_EXIT;
}//end else if(chValue >= 'A' && chValue <= 'F')
else if(chValue >= 'a' && chValue <= 'f')
{
*lpRes = chValue - 'a' + 10;
goto SAFE_EXIT;
}//end else if(chValue >= 'a' && chValue <= 'f')
bRet = false;
SAFE_EXIT:
return bRet;
}
/************************************************************************
功 能:将字符串转换为十六进制数据 如"012345678ABCDEF" --- 01 23 45 67 8A BC DE
参 数:Arg1:lpDes, 转换之后结果存放的位置;
参 数:Arg2:iMaxLength, 保留结果的缓冲区最大长度,最小值为 iSrcLen/2 ;
参 数:Arg3:lpSrc, 要转换的缓冲区数据首地址;
参 数:Arg4:iSrcLen, 要转换的缓冲区数据长度, 需要为2的整数倍, 如果不是2的倍数,
例如示例中的最后一个字符 'F';
返回值:lpDes中存放转换后十六进制数据的字节长度。
************************************************************************/
int Str2Hex(unsigned char* lpDes, int iMaxLength, const unsigned char* lpSrc, int iSrcLen)
{
int iRet = 0;
int iIndex = 0;
unsigned char szTemp[2] = {0};
if(NULL == lpSrc || NULL == lpDes || iMaxLength < iSrcLen/2)
{
return 0;
}//end if(NULL == lpSrc || NULL == lpDes || iMaxLength < iSrcLen/2)
for(iIndex = 0; iIndex < iSrcLen; iIndex += 2)
{
if(Char2Hex(*(lpSrc + iIndex), szTemp) && Char2Hex(*(lpSrc + iIndex + 1), &szTemp[1]))
{
*(lpDes + iIndex/2) = szTemp[0]*16 + szTemp[1];
}//end if(Char2Hex(*(lpSrc + iIndex), szTemp) && Char2Hex(*(lpSrc + iIndex + 1), &szTemp[1]))
else
{
return iRet;
}//end else
iRet++;
}//end for(iIndex = 0; iIndex < iSrcLen; iIndex += 2)
return iRet;
}
/************************************************************************
功 能:将十六进制数据转换为字符串, 例如 01 23 45 67 89 AB CD EF ---"0123456789ABCDEF"
参 数:Arg1:lpDes, 转换之后结果存放的位置;
参 数:Arg2:iMaxLength, 保留结果的缓冲区最大长度,最小值为 iSrcLen×2 + 1;
参 数:Arg3:lpSrc, 要转换的缓冲区数据首地址;
参 数:Arg4:iSrcLen, 要转换的缓冲区数据长度;
返回值:lpDes中存放转换后lpDes中实际存放的字节数,不包括最后的尾部字符'\0'。
************************************************************************/
int Hex2Str(unsigned char* lpDes, int iMaxLength, const unsigned char* lpSrc, int iSrcLen)
{
int iRet = 0;
int iIndex = 0;
unsigned char chTmep = 0;
if(NULL == lpSrc || NULL == lpDes || iMaxLength < (iSrcLen*2 + 1))
{
return 0;
}//end if(NULL == lpSrc || NULL == lpDes || iMaxLength < (iSrcLen*2 + 1))
for(iIndex = 0; iIndex < iSrcLen; iIndex++)
{
*(lpDes + iIndex*2) = ((chTmep = *(lpSrc + iIndex)/16) >= 10) ? (chTmep - 10 + 'A') : (chTmep + '0');
*(lpDes + iIndex*2 + 1) = ((chTmep = *(lpSrc + iIndex)%16) >= 10) ? (chTmep - 10 + 'A') : (chTmep + '0');
iRet += 2;
}//end for(iIndex = 0; iIndex < iSrcLen; iIndex++)
*(lpDes + iRet) = 0;
return iRet;
}
int _tmain(int argc, _TCHAR* argv[])
{
char szStr[100] = "ACBF35942687CDEFD";
char *lpData = NULL;
char *lpData1 = NULL;
int iRet = 0;
int iSrcLength = 0;
iSrcLength = strlen(szStr);
if(NULL != (lpData = new char[(iSrcLength + 1)/2]))
{
iRet = Str2Hex((unsigned char*)lpData, (iSrcLength + 1)/2, (unsigned char*)szStr, iSrcLength);
//lpData = AC BF 35 94 26 87 CD EF
}//end if(NULL != (lpData = new char[(iSrcLength + 1)/2]))
iSrcLength = iRet;
if(NULL != (lpData1 = new char[iSrcLength*2 + 1]))
{
iRet = Hex2Str((unsigned char*)lpData1, iSrcLength*2 + 1, (unsigned char*)lpData, iSrcLength);
//lpData1 = "ACBF35942687CDEF"
}//end if(NULL != (lpData1 = new char[iSrcLength*2 + 1]))
if(NULL != lpData)
{
delete lpData;
lpData = NULL;
}//end if(NULL != lpData)
if(NULL != lpData1)
{
delete lpData1;
lpData1 = NULL;
}//end if(NULL != lpData1)
return 0;
}
这篇博客分享了如何在C++中实现字符串(Str)与十六进制(Hex)之间的相互转换,作者提供了两个实用的封装函数,便于日常开发中的快速调用和后期查找。
353

被折叠的 条评论
为什么被折叠?



