码迷,mamicode.com
首页 > 编程语言 > 详细

URL解码(GBK/UTF8) C++算法

时间:2014-10-20 13:27:19      阅读:640      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   使用   for   

我们浏览的网页都会被不同的编码方式编码

例如 :“C++”  URL编码(GBK)为 “C%2B%2B”

 

那么,如何实现解码呢?

通过观察可得url编码的编码规则

1、数字和字母不进行编码。

2、其他符号编码方式为对应ascii码的2位16进制前面加上一个“%”。

例如 “+” 查表可知 对应的16进制数为2B ,所以,“+” 编码成了“%2B”。

 

程序思路:

定义一个char数组存放需要解码的数据,然后用指针遍历,如果碰到%号则对其后面的两位进行转码,然后指针后移3位。如果碰到数字和字母则输出即可。然后指针后移一位。

  1. 程序代码:
 1 #include <iostream>
 2 //#include <stdio.h>  
 3 
 4 using namespace std;
 5 
 6 int change(char *ch)
 7 {
 8     int n = atoi(ch);
 9     if(!n) //n == 0
10     {
11         return(*ch - ‘A‘ + 10);
12     }
13     else if( n >= 1 && n <= 9)
14     {
15         return n;
16     }
17 }
18 
19 int main()
20 {
21     int change(char *);
22     char a[20] = {‘\0‘};
23     int z;
24     cin >> a;
25     char *p = a;
26     for( int i = 0; i < 20; i++, p++)
27     {
28         if( int(*p) == 37)
29         {
30             char c[3] = "";
31             char x[2] = {*(p+1)};
32             char y[2] = {*(p+2)}; 
33             int x1 = change(x);
34             int y1 = change(y);
35             z = 16*x1 + y1;        
36             printf("%c",z);
37             p = p + 2;
38         }
39         else if( *p != ‘\0‘)
40         {
41             cout << *p;
42         }
43         if( *p == ‘\0‘)
44         {
45             break;
46         }
47         
48     }
49     return 0;
50 }

 

用到的函数:

  1. int atoi( const char *nptr)atio函数是C语言库函数,参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。头文件: #include <stdlib.h>,但在c++中,似乎已经包含了这个库函数。

 

注意的点:

 

1、定义数组char a[20]一定要把数组初始化为空。 否则转码可能出现意想不到的结果。因为你所需要转码的内容可能不能把a的空间占满,那么没有占满的空间数据就是未知的。所以定义的时候最好初始化为空。

 

(1) char str[10]="";

 

(2) char str[10]={‘\0‘};

 

(3) char str[10]; str[0]=‘\0‘;

 

第(1)(2)种方式是将str数组的所有元素都初始化为‘\0‘,而第(3)种方式是只将str数组的第一个元素初始化为‘\0‘。如果数组的size非常大,那么前两种方式将会造成很大的开销。所以,除非必要(即我们需要将str数组的所有元素都初始化为0的情况),我们都应该选用第(3)种方式来初始化字符串数组。

 

2、为什么要使用change函数。我们知道,ascii码是可以直接进行加减运算得到对应的16进制数。例如:"2B" = (‘2‘ - ‘0‘) * 16 + (‘B‘ - ‘A‘ + 10)=43 如果是数字字符,直接减字符0,如果是大写字符,直接减字符A,小写同理。B的ascii是66,A的是65,‘B‘ - ‘A‘ = 1 ,则对应的应该是11。那么不使用change函数可以直接运算吗?这里又有一个问题。我们无法确定%号后面的第一位是数字还是字母,所以无法使用公式进行计算,必须先交给change函数判断。int n = atoi(ch); 如果是字母,则返回值为return(*ch - ‘A‘ + 10);(这里只考虑大写的情况),如果是数字,则返回值为return n;

 

3、最后,判断*p的值是否指向’\0’,如果是 ,则结束循环。

bubuko.com,布布扣

 

URL解码(GBK/UTF8) C++算法

标签:style   blog   http   color   io   os   ar   使用   for   

原文地址:http://www.cnblogs.com/Grove/p/4036943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!