百度百科 https://baike.baidu.com/item/base64/8545775?fr=aladdin&fromid=1142965&fromtitle=base64%E7%BC%96%E8%A7%A3%E7%A0%81#4_3
简介:
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作
通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象
标识符的格式。
规则:
①.把3个字符变成4个字符。
②每76个字符加一个换行符。
③.最后的结束符也要处理
原理:
转码过程例子:3*8=4*6
内存1个字节占8位
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组)
011100 110011
000100 110011
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所有有了 高位补0
科学计算器输入
00011100
00110011
00000100
00110011
得到: 28 51 4 51
查对下照表: c z E z
迅雷的“专用地址”也是用Base64"加密"的,其过程如下:
一、在地址的前后分别添加AA和ZZ
二、对新的字符串进行Base64编码
而QQ旋风的干脆不加料,直接就对地址进行Base64编码了
转换表
Table 1: The Base64 Alphabet
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
0
|
A
|
17
|
R
|
34
|
i
|
51
|
z
|
1
|
B
|
18
|
S
|
35
|
j
|
52
|
0
|
2
|
C
|
19
|
T
|
36
|
k
|
53
|
1
|
3
|
D
|
20
|
U
|
37
|
l
|
54
|
2
|
4
|
E
|
21
|
V
|
38
|
m
|
55
|
3
|
5
|
F
|
22
|
W
|
39
|
n
|
56
|
4
|
6
|
G
|
23
|
X
|
40
|
o
|
57
|
5
|
7
|
H
|
24
|
Y
|
41
|
p
|
58
|
6
|
8
|
I
|
25
|
Z
|
42
|
q
|
59
|
7
|
9
|
J
|
26
|
a
|
43
|
r
|
60
|
8
|
10
|
K
|
27
|
b
|
44
|
s
|
61
|
9
|
11
|
L
|
28
|
c
|
45
|
t
|
62
|
+
|
12
|
M
|
29
|
d
|
46
|
u
|
63
|
/
|
13
|
N
|
30
|
e
|
47
|
v
| ||
14
|
O
|
31
|
f
|
48
|
w
| ||
15
|
P
|
32
|
g
|
49
|
x
| ||
16
|
Q
|
33
|
h
|
50
|
y
|
应用:
除了用于URL,
另有一种用于
正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
其他应用:
Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
Base64 也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
在LDIF档案,Base64用作编码字串。
此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
代码实现:
PHP版
[下列代码仅在GBK中实现,UTF8代码请把 if($button=="迅雷地址->普通地址") echo substr(base64_decode(str_ireplace("thunder://","",$txt1)),2,-2); 这句改为if($button=="迅雷地址->普通地址") echo substr(mb_convert_encoding(base64_decode(str_ireplace("thunder://","",$txt1))),2,-2); 并把charset=gb2312改为charset=utf-8]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
<?php
$txt1
=trim(
$_POST
[
'text1'
]);
$txt2
=trim(
$_POST
[
'text2'
]);
$txt3
=trim(
$_POST
[
'text3'
]);
$button
=
$_POST
[
'button'
];
?>
<!DOCTYPEHTMLPUBLIC
"-//W3C//DTDHTML4.0Transitional//EN"
>
<html>
<head>
<title>迅雷和FlashGet,QQ旋风地址地址转换工具</title>
<metahttp-equiv=
"Content-Type"
content=
"text/html;charset=gb2312"
>
<metacontent=
"迅雷,FlashGet,地址转换,"
name=
"keywords"
>
</head>
<body>
<formname=
"form1"
method=
"post"
action=
""
>
<hrsize=
"1"
>
<h3>迅雷转换</h3>
<P>转换地址:
<inputname=
"text1"
value=
"<?phpecho$txt1;?>"
type=
"text"
style=
"width:516px;"
/></P>
<P>转换后的:
<inputtype=
"text"
value="<?php
if
(
$button
==
"迅雷地址->普通地址"
)echosubstr(
base64_decode
(
str_ireplace
(
"thunder://"
,
""
,
$txt1
)),2,-2);
?>
"style="
width:516px;"/></P>
<P>
<inputtype=
"submit"
name=
"button"
value=
"普通地址->迅雷地址"
/>
<inputtype=
"submit"
name=
"button"
value=
"迅雷地址->普通地址"
/></P>
<h3>FlashGet转换</h3>
<P>FlashGet地址:
<inputname=
"text2"
value=
"<?phpecho$txt2;?>"
type=
"text"
style=
"width:516px;"
/></P>
<P>转换后地址:
<inputtype=
"text"
value="<?php
if
(
$button
==
"FlashGet地址->普通地址"
)echostr_ireplace(
"[FLASHGET]"
,
""
,
base64_decode
(
str_ireplace
(
"flashget://"
,
""
,
$txt2
)));
?>
"style="
width:516px;"/></P>
<P>
<inputtype=
"submit"
value=
"普通地址->FlashGet地址"
name=
"button"
/>
<inputtype=
"submit"
value=
"FlashGet地址->普通地址"
name=
"button"
/></P>
<h3>QQ旋风转换</h3>
<P>QQ旋风地址:
<inputname=
"text3"
value=
"<?phpecho$txt3;?>"
type=
"text"
style=
"width:516px;"
/></P>
<P>转换后地址:
<inputtype=
"text"
value="<?php
?>
"style="
width:516px;"/></P>
<P>
<inputtype=
"submit"
value=
"普通地址->QQ旋风"
name=
"button"
/>
<inputtype=
"submit"
value=
"QQ旋风->普通地址"
name=
"button"
/></P>
</form>
</body>
</html>
|