当用户通过表单(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得到的表单数据是经过编码后的,下面程序是用来解码的
- #include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
- /**** 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')))
-
int hexa(char c)
-
{
-
switch (c) {
-
case '0': return 0;
-
case '1': return 1;
-
case '2': return 2;
-
case '3': return 3;
-
case '4': return 4;
-
case '5': return 5;
-
case '6': return 6;
-
case '7': return 7;
-
case '8': return 8;
-
case '9': return 9;
-
case 'A':
-
case 'a': return 10;
-
case 'B':
-
case 'b': return 11;
-
case 'C':
-
case 'c': return 12;
-
case 'D':
-
case 'd': return 13;
-
case 'E':
-
case 'e': return 14;
-
case 'F':
-
case 'f': return 15;
-
}
-
return 0;
-
}
-
-
char *makespace (char *s)
-
{
-
int i,len;
-
len=strlen(s);
-
for(i=0;i<len;i++) {
-
if(s[i]=='+')
-
s[i]=' ';
-
}
-
return s;
-
}
-
- void *splite(char *s)
-
{
-
char *str;
-
str=strtok(s,"=");
-
while(str) {
-
printf("%s\t",str);
-
str=strtok(NULL,"&");
-
printf("%s\n",str);
-
str=strtok(NULL,"=");
-
}
-
}
-
-
char *convert(char *s)
-
{
-
int x,y,len;
-
char *data;
-
len=strlen(s);
-
data=(char*)malloc(sizeof(char)*(len+1));
-
strcpy(data,s);
-
y=0;
-
for(x=0;x<len;) {
-
if(s[x]!='%') {
-
data[y]=data[x];
-
y++;
-
x++;
-
}
-
else {
-
data[y]=(char)(16*hexa(s[x+1])+hexa(s[x+2]));
-
y++;
-
x=x+3;
-
}//endif
-
}//endfor
-
data[y]='\0';
-
return data;
-
}
-
-
int main(void)
-
{
-
char *tmp;
-
char code[256]="a=5&b=6&cc=7&sr=++++%3e%2b%6C%41";
-
tmp=makespace(code);
-
tmp=convert(tmp);
-
splite(tmp);
-
return 0;
-
}
阅读(5192) | 评论(0) | 转发(0) |