我们浏览的网页都会被不同的编码方式编码
例如 :“C++” URL编码(GBK)为 “C%2B%2B”
那么,如何实现解码呢?
通过观察可得url编码的编码规则
1、数字和字母不进行编码。
2、其他符号编码方式为对应ascii码的2位16进制前面加上一个“%”。
例如 “+” 查表可知 对应的16进制数为2B ,所以,“+” 编码成了“%2B”。
程序思路:
定义一个char数组存放需要解码的数据,然后用指针遍历,如果碰到%号则对其后面的两位进行转码,然后指针后移3位。如果碰到数字和字母则输出即可。然后指针后移一位。
- 程序代码:
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 }
用到的函数:
- 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’,如果是 ,则结束循环。