[TOC]
0x00 编程语言编码函数
JavaScript
描述:主要对于 escape , encodeURI 与 encodeURIComponent 区别详解: 它们都是用来对URI (RFC-2396)字符串进行编码的全局函数,但是它们的处理方式和使用场景有所不同:
代码语言:javascript复制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
实际案例:
代码语言:javascript复制//#Js编码函数
escape(url)
"https://www.jb51.net/article/109025.htm?name=test&web=osrf"
encodeURI(url)
"https://www.jb51.net/article/109025.htm?name=test&web=osrf"
encodeURIComponent(url)
"https://www.jb51.net/article/109025.htm?name=test&web=osrf"
基础示例2:
代码语言:javascript复制//我们看到 encodeURI 没有编码uri的保留字符 & ,'中'被编码成了 ��,encodeURIComponent 就编码了保留字符&
alert(encodeURIComponent("A&T Plastic")); //A&T Plastic
alert(escape("A&T Plastic")); //A&T Plastic
alert(encodeURI("A&T Plastic")); //A&T Plastic
alert(escape("A&T Plastic中")); //A&T Plastic��
总结:编码方式的应用场景
- 如果只是处理 get 提交时url地址中的乱码问题,可以使用 encodeURI 来编码整个url;
- 如果参数中含有保留字符需要进行编码,应该使用 encodeURIComponent 来编码部分参数;
- 如果使用encodeURIComponent来处理中文乱码,那么前端需要使用两次
encodeURIComponent(encodeURIComponent('你好'))
,Java后端使用:java.Net.URLDecoder.decode(param,"UTF-8");
0x01 编码与解码
base64/32
采用Linux中Shell进行base64/32编码和解码
代码语言:javascript复制# 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.
采用Openssl命令
代码语言:javascript复制#生成的随机数转换成为base64/32
openssl rand -base64 8 #长度8的倍数
b7WUZwW7R4=
WeiyiGeek.
Hex/Dec/Bin
Shell实现
代码语言:javascript复制#八进制转换为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.
bc命令实现 描述:bc是Linux 在命令行下有个强大的计算器工具
代码语言:javascript复制[root@WeiGeek ~]# yum -y install bc <!--安装命令-->
代码语言:javascript复制echo "obase=输出进制数;ibase=输入进制数;输入的数字" | bc
echo "obase=16;ibase=10;30" | bc #将10进制的30转换成16进制-
基础示例:
代码语言:javascript复制#!/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
- C语言itoa函数的进制转换:(注意不一定通用,在stdlib.h头文件中)
同时可以换算其他进制比如7进制 32 进制,更改后面的进制数的十进制即可语法:
代码语言:javascript复制//itoa(input变量名, ouput变量名, 进制数);
char dest[10];
itoa(src, dest, 2);
printf("二进制 --> %sn", dest);
代码案例:
代码语言:javascript复制#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: %sn", buffer);
itoa(i, buffer, 2);
printf("binary: %sn", buffer);
itoa(i, buffer, 8);
printf("octal: %sn", buffer);
itoa(i, buffer, 16);
printf("hexadecimal: %sn", buffer);
return 0;
}
printf函数进行标准进制转换
代码语言:javascript复制#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;
}
编写一个程序,用递归实现将一个十进制的正整数转换成二进制的形式显示
代码语言:javascript复制#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;
}