c++ 纯C版本url encode 和url decode 代码(不含cstring)

inline unsigned char ToHex(unsigned char x)
{
return  x > 9 ? x + 55 : x + 48;
}


inline unsigned char FromHex(unsigned char x)
{
unsigned char y;
if (x >= 'A' && x <= 'Z') y = x - 'A' + 10;
else if (x >= 'a' && x <= 'z') y = x - 'a' + 10;
else if (x >= '0' && x <= '9') y = x - '0';
else assert(0);
return y;
}
//1个字符会变三个字符,所以nBufferLen应是strlen(cIn)的三倍且再加一个字符串结束符才不会溢出
inline void UrlEncode(char*cOut,int nBufferLen,const char*cIn)
{
if (cOut == NULL || cIn == NULL)return;


size_t length = strlen(cIn);


//char *cDst = new char[length*3+1];
unsigned char*pDst = (unsigned char*)cOut;
unsigned char*pSrc = (unsigned char*)cIn;
int nAt = 0;
size_t i = 0;
while (i<length && pSrc[i] != 0 && nAt < nBufferLen)
{
if (isalnum(pSrc[i]) ||
(pSrc[i] == '-') ||
(pSrc[i] == '_') ||
(pSrc[i] == '.') ||
(pSrc[i] == '~'))
{
pDst[nAt++] = pSrc[i];
}
else if (pSrc[i] == ' ')
{
pDst[nAt++] = '+';
}
else
{
if (nAt > nBufferLen - 3)break;


pDst[nAt++] = '%';
pDst[nAt++] = ToHex(pSrc[i] >> 4);
pDst[nAt++] = ToHex(pSrc[i] % 16);
}
i++;
}
pDst[nAt] = 0;
}
//Decode三个字符会改为一个,所以nBufferLen应是strlen(cIn)的1倍也不会溢出
inline void UrlDecode(char*cOut, int nBufferLen, const char*cIn)
{
size_t length = strlen(cIn);
unsigned char*pDst = (unsigned char*)cOut;
unsigned char*pSrc = (unsigned char*)cIn;
int nAt = 0;
size_t i = 0;
while (i<length && pSrc[i] != 0 && nAt < nBufferLen)
{
if (pSrc[i] == '+') 

pDst[nAt++] = ' ';
}
else if (pSrc[i] == '%')
{
if (i + 2 < length)
{
unsigned char high = FromHex(pSrc[++i]);
unsigned char low = FromHex(pSrc[++i]);
pDst[nAt++] = high * 16 + low;
}
}
else
{
pDst[nAt++] = pSrc[i];
}
i++;
}
pDst[nAt] = 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值