[TOC]
0x00 编程语言编码函数
JavaScript
描述:主要对于 escape , encodeURI 与 encodeURIComponent 区别详解:
它们都是用来对URI (RFC-2396)字符串进行编码的全局函数,但是它们的处理方式和使用场景有所不同:1
2
3
4
5
6
7
8
91.保留字符(reserved characters):这类字符是URI中的保留关键字符,它们用于分割URI中的各个部分。这些字符是:";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
2.Mark字符(mark characters):这类字符在RFC-2396中特别定义,但是没有特别说明用途,可能是和别的RFC标准相关。 这些字符是:"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
3.基本字符(alphanum characters):这类字符是URI中的主体部分,它包括所有的大写字母、小写字母和数字。
escape不编码字符有69个: *,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不编码字符有82个: !,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个: !,',(,),*,-,.,_,~,0-9,a-z,A-Z
实际案例:1
2
3
4
5
6
7
8
9//#Js编码函数
escape(url)
"https%3A//www.jb51.net/article/109025.htm%3Fname%3Dtest%26web%3Dosrf%3Cscript%3Ealert%28/1/%29%3C/script%3E"
encodeURI(url)
"https://www.jb51.net/article/109025.htm?name=test&web=osrf%3Cscript%3Ealert(/1/)%3C/script%3E"
encodeURIComponent(url)
"https%3A%2F%2Fwww.jb51.net%2Farticle%2F109025.htm%3Fname%3Dtest%26web%3Dosrf%3Cscript%3Ealert(%2F1%2F)%3C%2Fscript%3E"
基础示例2:1
2
3
4
5//我们看到 encodeURI 没有编码uri的保留字符 & ,'中'被编码成了 %uFFFD%uFFFD,encodeURIComponent 就编码了保留字符&
alert(encodeURIComponent("A&T Plastic")); //A%26T%20Plastic
alert(escape("A&T Plastic")); //A%26T%20Plastic
alert(encodeURI("A&T Plastic")); //A&T%20Plastic
alert(escape("A&T Plastic中")); //A%26T%20Plastic%uFFFD%uFFFD
总结:编码方式的应用场景
- 如果只是处理 get 提交时url地址中的乱码问题,可以使用 encodeURI 来编码整个url;
- 如果参数中含有保留字符需要进行编码,应该使用 encodeURIComponent 来编码部分参数;
- 如果使用encodeURIComponent来处理中文乱码,那么前端需要使用两次
encodeURIComponent(encodeURIComponent('你好'))
,Java后端使用:java.Net.URLDecoder.decode(param,"UTF-8");
0x01 编码与解码
base64/32
采用Linux中Shell进行base64/32编码和解码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# base 加解密(默认base64)
echo test|base64
echo dGVzdAo=|base64 -d
#32与64位base编码与解码是不同的:
$ echo 123456 | base32.exe
GEZDGNBVGYFA====
$ echo 123456 | base64.exe
MTIzNDU2Cg==
#批量加密解密:
#Base64 Encrpty/Decrpty
exec 3<>num.txt
while read line<&3;do
echo $line | base64
done
for i in $(cat 1.txt);do
echo $i | base64 -d 1>>te.txt 2>/dev/null
echo -e "" >> te.txt
doneWeiyiGeek.
采用Openssl命令
1
2
3#生成的随机数转换成为base64/32
openssl rand -base64 8 #长度8的倍数
+b7WUZwW7R4=WeiyiGeek.
Hex/Dec/Bin
- Shell实现
1
2
3
4
5
6
7
8
9
10
11#八进制转换为Ascll
for i in 60 61 62 63 64 65 66 67 70 71
do
printf "Octal=$i,Ascll=\\$i \n"
done
#十六进制转Ascll
for i in 60 61 62 63 64 65 66 67 70 71
> do
> printf "hex=$i,Ascll=\x$i \n"
> doneWeiyiGeek.
1 | echo "obase=输出进制数;ibase=输入进制数;输入的数字" | bc |


基础示例:1
2
3
4
5
6
7
8
9
10
11
if [ $# = 0 ];then
echo "usage:${0} outputbase inputbase jzvalue"
else
oubase=$1
inbase=$2
value=$3
echo "obase=${oubase};ibase=${inbase};${value}" | bc
fi
usage:obase.sh outputbase inputbase jzvalue
#sh obase.sh 16 10 225
- C语言itoa函数的进制转换:(注意不一定通用,在stdlib.h头文件中)
同时可以换算其他进制比如7进制 32 进制,更改后面的进制数的十进制即可语法:1
2
3
4//itoa(input变量名, ouput变量名, 进制数);
char dest[10];
itoa(src, dest, 2);
printf("二进制 --> %s\n", dest);
代码案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main ()
{
int i;
char buffer[33];
printf("Enter a number: ");
scanf("%d", &i);
itoa(i, buffer, 10);
printf("decimal: %s\n", buffer);
itoa(i, buffer, 2);
printf("binary: %s\n", buffer);
itoa(i, buffer, 8);
printf("octal: %s\n", buffer);
itoa(i, buffer, 16);
printf("hexadecimal: %s\n", buffer);
return 0;
}

- printf函数进行标准进制转换
1
2
3
4
5
6
7
8
9
10
int main(){
int n;
scanf("%d",&n);
printf("转换的进制为:\n");
printf("octal:%o",n);
printf("decimal:%u",n);
printf("hexadecimal:%x",n);
return 0;
}
编写一个程序,用递归实现将一个十进制的正整数转换成二进制的形式显示
1 |
|