Base64 编码介绍

前言


首先看一下Wiki 上对于Base64的介绍。

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。

由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。


编码过程

过程如下:

1. base64的编码都是按字符串长度,以每3个8bit的字符为一组

2. 然后针对每组,首先获取每个字符的ASCII编码

3. 然后将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节

4. 然后再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节

5. 然后将这4个8bit的字节转换成10进制,对照Base64编码表 (下表),得到对应编码后的字符。

需要注意的是:

1. 要求被编码字符是8bit的,所以须在ASCII编码范围内,\u0000-\u00ff,中文就不行。

2. 如果被编码字符长度不是3的倍数的时候,则都用0代替,对应的输出字符为=


在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。

Base64索引表:

Value Char   Value Char   Value Char   Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /


实例

这里举字符长度能被 3 整除和不能被3 整除的两个例子

1)  字符长度为能被3整除时:比如“Tom”

            T                   o                 m
ASCII:      84               111             109
8bit字节:   01010100    01101111    01101101
6bit字节:     010101      000110      111101      101101
十进制:       21             6               61              45
对应编码:     V             G               9                t  

所以Tom 经过base64 编码后变为  VG9t

2) 字符长度不能被3 整除, 比如 “Lucy”

              L                      u           c           y
ASCII:      76                   117        99          121
8bit字节:   01001100    01110101    01100011    01111001      00000000    00000000
6bit字节:     010011      000111      010101      100011      011110  010000  000000  000000
十进制:        19             7               21             35             30        16          (异常)    (异常)      
对应编码:     T              H               V                j               e         Q            =          =
由于Lucy只有4个字母,所以按3个一组的话,第二组还有两个空位,所以需要用0来补齐。这里就需要注意,因为是需要补齐而出现的0,所以转化成十进制的时候就不能按常规用base64编码表来对应,所以不是a, 可以理解成为一种特殊的“异常”,编码应该对应“=”。



其他

1. MIME 外的其他标准

然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“*”和“-”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。



你可能感兴趣的:(450-操作系统及相关)