随笔 - 390,  文章 - 34,  评论 - 62,  阅读 - 139万

URLEncode:
  用于编码URL字符串,数字和字母保持不变,空格变为'+',其他(如:中文字符)先转换为十六进制表示,然后在每个字节前面加一个标识符%,
例如:“啊”字 Ascii的十六进制是0xB0A1——>%B0%A1

代码实现:

复制代码
 1 unsigned char CHAR_TO_HEX( unsigned char ch )
 2 {
 3     //0xa(10)转化为字符'A'(65),要加上55 //0x0(0)转化为字符'0'(48),要加上48
 4     return (unsigned char)(ch > 9 ? ch + 55: ch + 48);
 5 }
 6 
 7 std::string URLEncode(const char* pSrc)
 8 {
 9     unsigned char chTemp;
10     std::string strDest;
11 
12     while (*pSrc)
13     {
14         chTemp = (unsigned char)*pSrc;
15         if ( (chTemp >= 'a' && chTemp <= 'z') || (chTemp >= 'A' && chTemp <= 'Z') || (chTemp >= '0' && chTemp <= '9')
16             || strchr("-_.!~*'()", chTemp))
17         {
18             strDest += chTemp;
19         }
20          else if (chTemp == ' ')
21          {
22              *pDest++ = '+';
23          }
24         else
25         {
26             strDest += '%';
27             strDest += CHAR_TO_HEX( (unsigned char)(chTemp >> 4) );
28             strDest += CHAR_TO_HEX( (unsigned char)(chTemp & 0x0f) );
29         }
30         ++pSrc;
31     }
32 
33     return strDest;
34 }
复制代码

 

URLDecode:
  用于解码已编码的URL 字符串,解码方式与URLEncode相反

代码实现:

复制代码
 1 unsigned char* URLDecode(unsigned char* pSrc, std::string &strDest)
 2 {
 3     char szTemp[2];
 4 
 5     while (*pSrc)
 6     {
 7         memset(szTemp, '/0', 2 );
 8         if( *pSrc != '%' && *pSrc != ' ')
 9         {
10             strDest += *pSrc++;
11             continue;
12         }
13         else if( *pSrc == ' ' )
14         {
15             strDest += '+';
16             continue;
17         }
18         //忽略%
19         ++pSrc;
20         unsigned char cTmp = 0;
21 
22         for (int k = 0; k < 2 && *pSrc; ++k, ++pSrc)    //例如:将%3f ---> 0x3f
23         {
24             if(*pSrc <= '9')//0x30~0x39
25             {
26                 cTmp |= (*pSrc & 0x0f) << (1 - k) * 4;
27             }
28             else if(*pSrc >= 'a')//0x61~7a
29             {
30                 cTmp |= (*pSrc - 0x57) << (1 - k) * 4;
31             }
32             else//0x41~5a
33             {
34                 cTmp |= (*pSrc - 0x37) << (1 - k) * 4;
35             }
36         }
37         strDest += cTmp;
38     }
39     return 0;
40 }
复制代码

 

posted on   可笑痴狂  阅读(10312)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2013-04-01 状态图试验
2013-04-01 NYOJ-70 阶乘因式分解(二)
2013-04-01 c/s网络编程
2013-04-01 HDOJ-4535 吉哥系列故事——礼尚往来
2013-04-01 HDOJ-4530 小Q系列故事——大笨钟

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示