当前位置: 代码迷 >> 综合 >> 用C++实现HttpUtility.UrlEncode和HttpUtility.UrlDecode
  详细解决方案

用C++实现HttpUtility.UrlEncode和HttpUtility.UrlDecode

热度:41   发布时间:2023-12-12 02:03:05.0

首先,需要先了解HttpUtility.UrlEncode是怎样编码的:

1.数字和字母不变。

2.空格变为"+"号。
3.其他被编码成"%"加上他们的ascii的十六进制,规律是这样的
比如汉字“啊”字 Ascii的十六进制是B0A1,则编码后为"%B0%A1"(每个字节前加个%)。
/*******************************************
* URLCode.h
******************************************/
#pragma once
#include <string>
using namespace std;
class CURLCode
{
public:
 CURLCode(){};
 virtual ~CURLCode(){};
 static string Encode(const char* lpszData);
 static string Decode(string inTmp);
private:
 inline static unsigned char toHex(const unsigned char &x){ return x > 9 ? x + 55: x + 48; }
 inline static unsigned char fromHex(const unsigned char &x){ return x > 64 ? x - 55 : x - 48; }
};
/*******************************************
* URLCode.cpp
******************************************/
#include "URLCode.h"
string CURLCode::Encode(const char* lpszData)
{
 string strResult = "";
 unsigned char* pInTmp = (unsigned char*)lpszData;
// do encoding
 while (*pInTmp)
 {
  if(isalnum(*pInTmp))
   strResult += *pInTmp;
  else
   if(isspace(*pInTmp))
    strResult += '+';
   else
   {
    strResult += '%';
    strResult += toHex(*pInTmp>>4);
    strResult += toHex(*pInTmp%16);
   }
pInTmp++;
 }
 
 return strResult;
}
string CURLCode::Decode(string inTmp)
{
 string strResult = "";
 int inlen = inTmp.length();
 for(int i=0;i<inlen;i++)
 {
  if(inTmp.at(i)=='%')
  {
   i++;
   char c = fromHex(inTmp.at(i++));
   c = c << 4;
   c += fromHex(inTmp.at(i));
   strResult += c;
  }
  else if(inTmp.at(i)=='+')
   strResult += ' ';
  else
   strResult += inTmp.at(i);
 }
return strResult;
}