Decode a hex string by using look up table

char m_table['f' + 1]['f' + 1] = {0};

void initDecodeTable() {
    const char * hexValue = "0123456789abcdefABCDEF";

    int len = strlen(hexValue);

    for(int i=0;i < len;i++) {
	for(int j=0;j
	    int v;
	    char tmp[2] = { tolower(hexValue[i]), tolower(hexValue[j]) };

	    sscanf(tmp, "%x", &v);

	    m_table[hexValue[i]][hexValue[j]] = (v & 0xFF);
	}
    }
}

void decodeHex(const char * pIn, int inLen, char * pOut, int & outLen) {
    outLen = inLen / 2;

    for(int i=0; i < outLen;i++) {
	pOut[i] = m_table[pIn[i * 2]][pIn[i * 2 + 1]];
    }

    if (inLen % 2 != 0) {
	pOut[outLen++] = m_table[pIn[inLen - 1]]['0'];
    }
}

To another soluiton encode/decode a hex using look up table, please refer to
http://www.experts-exchange.com/Programming/Languages/.NET/Visual%5FCPP/A%5F1290-Fast-Hexadecimal-Encode-and-Decode.html

BYTE HexLookup[513]= {
      "000102030405060708090a0b0c0d0e0f"
      "101112131415161718191a1b1c1d1e1f"
      "202122232425262728292a2b2c2d2e2f"
      "303132333435363738393a3b3c3d3e3f"
      "404142434445464748494a4b4c4d4e4f"
      "505152535455565758595a5b5c5d5e5f"
      "606162636465666768696a6b6c6d6e6f"
      "707172737475767778797a7b7c7d7e7f"
      "808182838485868788898a8b8c8d8e8f"
      "909192939495969798999a9b9c9d9e9f"
      "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
      "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
      "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
      "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
      "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
      "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"
};
void ToHex( BYTE* pSrc, int nSrcLen, CString& sDest )
{
      WORD* pwHex=  (WORD*)HexLookup;
      WORD* pwDest= (WORD*)sDest.GetBuffer((nSrcLen*2)+1);

      for (int j=0; j<nSrcLen; j++ ) {
	      *pwDest= pwHex[*pSrc];
	      pwDest++; pSrc++;
      }
      *((BYTE*)pwDest)= 0;  // terminate the string
      sDest.ReleaseBuffer((nSrcLen*2)+1);
}

BYTE DecLookup[] = {
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // gap before first hex digit
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,1,2,3,4,5,6,7,8,9,       // 0123456789
      0,0,0,0,0,0,0,             // :;<=>?@ (gap)
      10,11,12,13,14,15,         // ABCDEF
      0,0,0,0,0,0,0,0,0,0,0,0,0, // GHIJKLMNOPQRS (gap)
      0,0,0,0,0,0,0,0,0,0,0,0,0, // TUVWXYZ[/]^_` (gap)
      10,11,12,13,14,15          // abcdef
};
void FromHex( BYTE* pSrc, int nSrcLen, BYTE* pDest )
{
      for (int j=0; j<nSrcLen; j += 2 ) {
	      int d =  DecLookup[*pSrc++ ] << 4;
		  d |= DecLookup[*pSrc++ ];
	      *pDest++ = (BYTE)d;
      }
}