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;
}
}