Base64编码

来源:互联网 发布:mac换输入法快捷键 编辑:程序博客网 时间:2024/04/28 20:51

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息

 

base64是一种将二进制的01序列转化成ASCII字符的编码方法。编码后的文本或者二进制消息,就可以用SMTP等只支持ASCII字符的协议传送了。Base64一般被认为会平均增加33%的报文长度,而且,经过编码的消息对于人类来说是不可读的。

 

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

 

编码的规则:

①把3个字符变成4个字符。

②每76个字符加一个换行符。

③.最后的结束符也要处理。

 

举例:

转码过程要求:3*8=4*6(但内存中1个字符是占8位的,转后的6位码要在高位添加两个0)

转前: s 1 3

先转成ascii:对应 115 49 51

2进制: 01110011   00110001   00110011

6个一组重组(4组) 011100110011000100110011

得到 011100   110011   000100   110011

但是计算机是88位的存数, 6位不够,就自动在高位补两个0

得到 00011100  00110011  00000100  00110011

科学计算器分别输入上述二进制,得到 28  51  4  51

查对下照表得转后: c z E z


如果用C#自有的类方法对字符进行Base64编码,然后再还原,则简单:

           //将UniCode字符进行Base64编码:
            string a = "测试"; //原始字符
            byte[] b = Encoding.UTF8.GetBytes(a); //将UniCode字符用UTF8方式编码,再转成字节数组(即转换成0和1的二进制)
                //(注,UTF8是属于UniCode字符集的编码方式,目的是为了
                   //能在现存的处理单字节的系统上 正确传输双字节的Unicode字符,发明了UTF8方式对Unicode字符进行编码)

            string c = Convert.ToBase64String(b);  //对二进制字节数组转换成Base64编码,得到"5rWL6K+V77yB";

(注:蓝色字记忆用:编码对应单词Encodeing;转换对应单词Convert)

            //将Base64编码再还原成原始字符:
            byte[] d = Convert.FromBase64String(c);  //先将Base64编码的字符,转换成二进制字节数组
            string e = Encoding.UTF8.GetString(d);  //再将二进制字节数组,用UTF8反编码的方式,编码还原原始的UniCode字符


            //以上分步很多时候都是合在一起写,比如:
            Console.WriteLine("字符“"+a+"”的Base64编码是:"+Convert.ToBase64String(Encoding.UTF8.GetBytes(a)));
            //以下字符变量c,也可以用上语的:Convert.ToBase64String(Encoding.UTF8.GetBytes(a)))替换
            Console.WriteLine("Base64编码“"+c+"”原文是:"+Encoding.UTF8.GetString(Convert.FromBase64String(c)));
            Console.ReadLine(); 



原始的转换编程思路:

  • 第一个字节,根据源字节的第一个字节处理。

规则:源第一字节右移两位,去掉低2位,高2位补零。

既:00 + 高6位

  • 第二个字节,根据源字节的第一个字节和第二个字节联合处理。

规则如下,第一个字节高6位去掉然后左移四位,第二个字节右移四位

即:源第一字节低2位 + 源第2字节高4位

  • 第三个字节,根据源字节的第二个字节和第三个字节联合处理,

规则第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可

  • 第四个字节,规则,源第三字节去掉高2位即可

 

编程方法:

  • 第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。

  • 然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|),即获得第二个目标字符。

  • 再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位与前者相或(|),获得第三个目标字符。

  • 最后将第三个字符与0x3f(00111111)进行与(&)操作即获得第四个目标字符。

  • 在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。

可是等等……聪明的你可能会问到,原文的字节数量应该是3的倍数啊,如果这个条件不能满足的话,那该怎么办呢?

我们的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1变2,2变3;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为:一个原字节至少会变成两个目标字节所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。

 

很多下载网站提供的“迅雷下载”专用的下载地址链接,也是用Base64"加密"的,其过程如下:

一、在地址的前后分别添加AA和ZZ

二、对新的字符串进行Base64编码

Flashget的与迅雷类似,只不过在第一步时加的“料”不同罢了,Flashget在地址前后加的“料”是[FLASHGET]

而QQ旋风的干脆不加料,直接就对地址进行Base64编码了


Base64编码的字母对照表

索引
对应字符
索引
对应字符
索引
对应字符
索引
对应字符
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

以上内容来自于百度百科

0 0
原创粉丝点击