Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1599447
  • 博文数量: 92
  • 博客积分: 2002
  • 博客等级: 大尉
  • 技术积分: 4717
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-01 17:09
文章分类

全部博文(92)

文章存档

2013年(1)

2012年(6)

2011年(85)

分类: LINUX

2011-05-31 02:22:47

当用户通过表单(FORM)提交信息时,浏览器会首先会按照一定规则对这些信息进行编码。
这些编码规则主要包含以下几点:   
  使用“=”分割表单中元素的名称及其值;
  使用“+”代替表单信息中的空格;
  使用“ &”分割表单中的不同元素

  对一些非字母的特殊字符进行十六进制编码,并在相应的编码前加入“%”。
例如“&”的十六进制编码为:26,则在提交表单时,浏览器会将字符串“Rock & Roll”编码为“Rock+%26+Roll”。
    下面列出了一些常用的特殊字符及其相应的十六进制编码。   

字符   十六进制编码   

" 22   ( 28   ) 29   , 2C   ; 3B   : 3A   < 3C   > 3E    
[ 5B   \ 5C   ] 5D   ^ 5E   ` 60   { 7B     7C   } 7D   
? 3E   & 26   / 2F   = 3D   # 23   % 25


CGI得到的表单数据是经过编码后的,下面程序是用来解码的
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. /**** num <---> char ****/
    #define HEX2C(x) (((x)>9)?(('a'-10)+(x)):('0'+(x)))
    #define C2HEX(x) (unsigned char)( (x)>'a'? (x-'a'+10):(x-'0') )

    /**** 16进制 <---> 10进制 ****/
    #define HEX_TO_DECIMAL(char1, char2)    \
     (((char1 >= 'A') ? (((char1 & 0xdf) - 'A') + 10) : (char1 - '0')) * 16) + \
     (((char2 >= 'A') ? (((char2 & 0xdf) - 'A') + 10) : (char2 - '0')))

  1. int hexa(char c)
  2. {
  3.     switch (c) {
  4.         case '0': return 0;
  5.         case '1': return 1;
  6.         case '2': return 2;
  7.         case '3': return 3;
  8.         case '4': return 4;
  9.         case '5': return 5;
  10.         case '6': return 6;
  11.         case '7': return 7;
  12.         case '8': return 8;
  13.         case '9': return 9;
  14.         case 'A':
  15.         case 'a': return 10;
  16.         case 'B':
  17.         case 'b': return 11;
  18.         case 'C':
  19.         case 'c': return 12;
  20.         case 'D':
  21.         case 'd': return 13;
  22.         case 'E':
  23.         case 'e': return 14;
  24.         case 'F':
  25.         case 'f': return 15;
  26.     }
  27.     return 0;
  28. }

  29. char *makespace (char *s)
  30. {
  31.     int i,len;
  32.     len=strlen(s);
  33.     for(i=0;i<len;i++) {
  34.         if(s[i]=='+')
  35.             s[i]=' ';
  36.     }
  37.     return s;
  38. }

  39. void *splite(char *s)
  40. {
  41.     char *str;
  42.     str=strtok(s,"=");
  43.     while(str) {
  44.         printf("%s\t",str);
  45.         str=strtok(NULL,"&");
  46.         printf("%s\n",str);
  47.         str=strtok(NULL,"=");
  48.     }
  49. }

  50. char *convert(char *s)
  51. {
  52.     int x,y,len;
  53.     char *data;
  54.     len=strlen(s);
  55.     data=(char*)malloc(sizeof(char)*(len+1));
  56.     strcpy(data,s);
  57.     y=0;
  58.     for(x=0;x<len;) {
  59.         if(s[x]!='%') {
  60.             data[y]=data[x];
  61.             y++;
  62.             x++;
  63.         }
  64.         else {
  65.             data[y]=(char)(16*hexa(s[x+1])+hexa(s[x+2]));
  66.             y++;
  67.             x=x+3;
  68.         }//endif
  69.     }//endfor
  70.     data[y]='\0';
  71.     return data;
  72. }

  73. int main(void)
  74. {
  75.     char *tmp;
  76.     char code[256]="a=5&b=6&cc=7&sr=++++%3e%2b%6C%41";
  77.     tmp=makespace(code);
  78.     tmp=convert(tmp);
  79.     splite(tmp);
  80.     return 0;
  81. }

阅读(5218) | 评论(0) | 转发(0) |
0

上一篇:C语言的正则表达式

下一篇:TCP窗口调节

给主人留下些什么吧!~~