URLEncode






3.50/5 (6 votes)
Jun 21, 2001

177157

1372
Convert string using URLEncode method
URLEncode
I use this functions to prepare POST strings with XML data. The first function URLEncode1
uses less memory but is slower than the second URLEncode2
. Both functions return a CString
and get a CString
as the input parameter.
The demo project contains sample usage with execution time of presented functions.
Source
Helper function
inline BYTE toHex(const BYTE &x) { return x > 9 ? x + 55: x + 48; }
URLEncode1
CString URLEncode1(CString sIn) { CString sOut; int k; const int nLen = sIn.GetLength() + 1; register LPBYTE pOutTmp = NULL; LPBYTE pOutBuf = NULL; register LPBYTE pInTmp = NULL; LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen); BYTE b = 0; //count not alphanumeric characters k = 0; pInTmp = pInBuf; while(*pInTmp) { if (!isalnum(*pInTmp) && !isalnum(*pInTmp)) k++; pInTmp++; } //alloc out buffer pOutBuf = (LPBYTE)sOut.GetBuffer(nLen + 2 * k); //new BYTE [nLen + 3 * k]; if(pOutBuf) { pInTmp = pInBuf; pOutTmp = pOutBuf; // do encoding while (*pInTmp) { if(isalnum(*pInTmp)) *pOutTmp++ = *pInTmp; else if(isspace(*pInTmp)) *pOutTmp++ = '+'; else { *pOutTmp++ = '%'; *pOutTmp++ = toHex(*pInTmp>>4); *pOutTmp++ = toHex(*pInTmp%16); } pInTmp++; } *pOutTmp = '\0'; //sOut=pOutBuf; //delete [] pOutBuf; sOut.ReleaseBuffer(); } sIn.ReleaseBuffer(); return sOut; }
URLEncode2
CString URLEncode2(CString sIn) { CString sOut; const int nLen = sIn.GetLength() + 1; register LPBYTE pOutTmp = NULL; LPBYTE pOutBuf = NULL; register LPBYTE pInTmp = NULL; LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen); BYTE b = 0; //alloc out buffer pOutBuf = (LPBYTE)sOut.GetBuffer(nLen * 3 - 2);//new BYTE [nLen * 3]; if(pOutBuf) { pInTmp = pInBuf; pOutTmp = pOutBuf; // do encoding while (*pInTmp) { if(isalnum(*pInTmp)) *pOutTmp++ = *pInTmp; else if(isspace(*pInTmp)) *pOutTmp++ = '+'; else { *pOutTmp++ = '%'; *pOutTmp++ = toHex(*pInTmp>>4); *pOutTmp++ = toHex(*pInTmp%16); } pInTmp++; } *pOutTmp = '\0'; //sOut=pOutBuf; //delete [] pOutBuf; sOut.ReleaseBuffer(); } sIn.ReleaseBuffer(); return sOut; }
Modifications
26.06.2001 - changed out buffer memory allocation (thx 2 Marc Brooks and Matthias)