C, C++ 문법

헥스 문자열과 값의 상호 변환

디버그정 2011. 7. 25. 22:22


/**
 @author  nameless
 @brief  값을 헥스 문자열로 변환한다.

 1바이트당 문자 2개로 표현한다.
 예를 들어 0의 경우에 "0"이 아닌 "00"으로 변환한다.
*/
unsigned int __stdcall ValToHexStrA(char *pszDestStr, const void *pSrcVal, unsigned int cbSize)
{
 unsigned int len;
 len = cbSize << 1;
 for (; cbSize; cbSize--) {
  *(unsigned char *)pszDestStr = *(unsigned char *)pSrcVal >> 4; // 상위 4비트(128 이상인 값의 연산 대비 unsigned 형으로 캐스팅)
  if (*pszDestStr >= 0 && *pszDestStr <= 9) *(unsigned char *)pszDestStr = *(unsigned char *)pszDestStr + 48; // 0 ~ 9
  else           *(unsigned char *)pszDestStr = *(unsigned char *)pszDestStr + 55; // A ~ F
  pszDestStr++;
  *(unsigned char *)pszDestStr = *(unsigned char *)pSrcVal & 0xF; // 하위 4비트
  if (*pszDestStr >= 0 && *pszDestStr <= 9) *(unsigned char *)pszDestStr = *(unsigned char *)pszDestStr + 48; // 0 ~ 9
  else           *(unsigned char *)pszDestStr = *(unsigned char *)pszDestStr + 55; // A ~ F
  pszDestStr++;
  pSrcVal = (const void *)((unsigned char *)pSrcVal + 1);
 }
 *pszDestStr = NULL;  // 널 종료
 return len; // pszDestStr에 저장되는 문자열 길이를 리턴
}


/**
 @author  nameless
 @brief  헥스 문자열을 값으로 변환한다.

 전달되는 소스 문자열은 1바이트당 문자 2개의 표현 규격을 가져야 된다.
 예를 들어 값이 1인 경우 "1"이 아닌 "01"로 표현되어야 한다.
*/
unsigned int __stdcall HexStrToValA(void *pDestVal, const char *pszHexStr)
{
 unsigned int cbDest;
 cbDest = 0;
 for (; *pszHexStr; ) { 
  if  (*pszHexStr >= '0' && *pszHexStr <= '9') *(unsigned char *)pDestVal = (*(unsigned char *)pszHexStr - 48) << 4;
  else if (*pszHexStr >= 'A' && *pszHexStr <= 'F') *(unsigned char *)pDestVal = (*(unsigned char *)pszHexStr - 55) << 4;
  else if (*pszHexStr >= 'a' && *pszHexStr <= 'f') *(unsigned char *)pDestVal = (*(unsigned char *)pszHexStr - 87) << 4;
  else return cbDest;
  pszHexStr++;
  if  (*pszHexStr >= '0' && *pszHexStr <= '9') *(unsigned char *)pDestVal |= (*(unsigned char *)pszHexStr - 48);
  else if (*pszHexStr >= 'A' && *pszHexStr <= 'F') *(unsigned char *)pDestVal |= (*(unsigned char *)pszHexStr - 55);
  else if (*pszHexStr >= 'a' && *pszHexStr <= 'f') *(unsigned char *)pDestVal |= (*(unsigned char *)pszHexStr - 87);
  else return cbDest;
  pszHexStr++;
  cbDest++;
  pDestVal = (void *)((unsigned char *)pDestVal + 1);
 }
 return cbDest;
}