[TOC]

0x00 编程语言编码函数

JavaScript

描述:主要对于 escape , encodeURI 与 encodeURIComponent 区别详解:
它们都是用来对URI (RFC-2396)字符串进行编码的全局函数,但是它们的处理方式和使用场景有所不同:

1
2
3
4
5
6
7
8
9
1.保留字符(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
  1. 采用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==

    #批量加密解密:
    #!/bin/bash
    #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
    done
    WeiyiGeek.

    WeiyiGeek.


  2. 采用Openssl命令

    1
    2
    3
    #生成的随机数转换成为base64/32
    openssl rand -base64 8 #长度8的倍数
    +b7WUZwW7R4=
    WeiyiGeek.

    WeiyiGeek.


Hex/Dec/Bin
  1. 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"
    > done
    WeiyiGeek.

    WeiyiGeek.

  1. bc命令实现
    描述:bc是Linux 在命令行下有个强大的计算器工具
    1
    [[email protected] ~]# yum -y install bc   <!--安装命令-->

1
2
echo "obase=输出进制数;ibase=输入进制数;输入的数字" | bc
echo "obase=16;ibase=10;30" | bc #将10进制的30转换成16进制-

基础示例:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
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


  1. 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
#include <stdio.h>
#include <stdlib.h>
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;
}

  1. printf函数进行标准进制转换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    int main(){
    int n;
    scanf("%d",&n);
    printf("转换的进制为:\n");
    printf("octal:%o",n);
    printf("decimal:%u",n);
    printf("hexadecimal:%x",n);
    return 0;
    }

编写一个程序,用递归实现将一个十进制的正整数转换成二进制的形式显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
void binary(unsigned long n);
void binary(unsigned long n)
{
int r;
r = n % 2; //取余
if (n >= 2){
binary(n / 2); //进行递归
}
putchar('0' + r); // '0'=>48 + 1 == '1' (归-精华之所在)
}

int main(void){
unsigned long number;
printf("请输入一个正整数:");
scanf("%lu", &number);
binary(number);
putchar('\n');
return 0;
}