用VC(MFC)实现ASP中的Server.URLEncode与URLDecode
2008-06-06 10:09
465 查看
今天做程序因为要用到UrlEncode和UrlDecode,所以到网上找了一下,想用个现成的。找来找去,发现郑昀老师的代码思路是最清晰的,也很和胃口,但可惜的是只有一半 —— UrlEncode(),又看了看其他人写的,都不怎么样。所以一咬牙,干脆自己动手把UrlDecode()补上了,再做成头文件,以后用起来也方便(懒人啦
)。
看见还有很多人搜索,所以贴出来一份给其他懒人。
代码如下:
inline BYTE toHex(const BYTE &x)
{
return x > 9 ? x + 55: x + 48;
}
inline BYTE toByte(const BYTE &x)
{
return x > 57? x - 55: x - 48;
}
CString URLDecode(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);
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if('%'==*pInTmp)
{
pInTmp++;
*pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;//高4位+低4位
pInTmp++;
}
else if('+'==*pInTmp)
*pOutTmp++ = ' ';
else
*pOutTmp++ = *pInTmp;
pInTmp++;
}
*pOutTmp = '/0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
CString URLEncode(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);
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp)
*pOutTmp++ = *pInTmp;
else if(isspace(*pInTmp))
*pOutTmp++ = '+';
else
{
*pOutTmp++ = '%';
*pOutTmp++ = toHex(*pInTmp>>4);//高4位
*pOutTmp++ = toHex(*pInTmp%16);//低4位
}
pInTmp++;
}
*pOutTmp = '/0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
代码中用了两个内联函数,想一想,那么放着也挺好,没必要整合进去。原源代码中仅对空格做了判断,Monyer又填上了“-_.”,算是更标准了些。
把这个函数放进去后,一个小工具的主要函数便完成了,再修改修改,明天放出来。
Monyer!
)。
看见还有很多人搜索,所以贴出来一份给其他懒人。
代码如下:
inline BYTE toHex(const BYTE &x)
{
return x > 9 ? x + 55: x + 48;
}
inline BYTE toByte(const BYTE &x)
{
return x > 57? x - 55: x - 48;
}
CString URLDecode(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);
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if('%'==*pInTmp)
{
pInTmp++;
*pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;//高4位+低4位
pInTmp++;
}
else if('+'==*pInTmp)
*pOutTmp++ = ' ';
else
*pOutTmp++ = *pInTmp;
pInTmp++;
}
*pOutTmp = '/0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
CString URLEncode(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);
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp)
*pOutTmp++ = *pInTmp;
else if(isspace(*pInTmp))
*pOutTmp++ = '+';
else
{
*pOutTmp++ = '%';
*pOutTmp++ = toHex(*pInTmp>>4);//高4位
*pOutTmp++ = toHex(*pInTmp%16);//低4位
}
pInTmp++;
}
*pOutTmp = '/0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
代码中用了两个内联函数,想一想,那么放着也挺好,没必要整合进去。原源代码中仅对空格做了判断,Monyer又填上了“-_.”,算是更标准了些。
把这个函数放进去后,一个小工具的主要函数便完成了,再修改修改,明天放出来。
Monyer!
相关文章推荐
- 用VC(MFC)实现ASP中的Server.URLEncode与URLDecode
- ASP中的Server.URLEncode在VC中的实现
- ASP中的Server.URLEncode在VC中的实现
- ASP中的Server.URLEncode在VC中的实现
- VB中实现ASP中Server.URLEncode与Server.URLDecode
- ASP中的Server.URLEncode在VC中的实现
- ASP-server.URLEncode反函数:urldecode
- 在SQL Server 2005中实现 Server.UrlEncode、Server.UrlDecode
- VB,VBS,实现server.URLEncode及反编码功能的函数URLEncode()与URLDecode()
- 实现Server.UrlEncode和Server.UrlDecode功能的js代码
- ASP中的Server.URLEncode在Ansi C中的实现
- 实现Server.UrlEncode和Server.UrlDecode功能的js代码
- 实现Server.UrlEncode和Server.UrlDecode功能的js代码
- ASP-server.URLEncode反函数:urldecode
- 在SQL Server 2005中实现 Server.UrlEncode、Server.UrlDecode
- 实现Server.UrlEncode和Server.UrlDecode功能的js代码
- VC++(MFC)实现SQL Server的远程连接(ADO实现)
- VC MFC 钩子 实现 自绘 窗体 标题栏 非客户区(VER.2013-11-06)
- VC++, MFC中实现选择文件夹,选择文件对话框,确定当前工作目录(转载)
- [转]ASP.net中的Server.UrlEncode函数和ASP中的Server.URLEncode函数返回的值竟然不一样!!!!