Str和Hex的互转

这篇博客分享了如何在C++中实现字符串(Str)与十六进制(Hex)之间的相互转换,作者提供了两个实用的封装函数,便于日常开发中的快速调用和后期查找。

由于经常会用到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;
}

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值