Skip to content
本页目录

base64 格式的数据实现原理

TIP

base64是处理二进制数据的一种编码方式,可用于把二进制数据编码成 64 个可打印的字符。

字节

一个字节由 8 位二进制数据组成即 00000000 -- 11111111。

编码

编码是把字符串转化成二进制数据的一种方式。

base64 编码表

码值字符码值字符码值字符码值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

base64 的实现

base64 的实现就是通过把字符串转化为二进制数据,然后按照每 6 位二进制数据来进行分割,用 0 补位凑成 8 位,再把 8 位二进制数据转化为十进制数找到对应的映射表就可生成 base64 编码。

具体实现步骤

  1. 将字符串转化为二进制数据
  2. 二进制数据按照每 6 位一组分割, 不足 6 位的补 0
  3. 6 位二进制数据用 0 补位凑成 8 位,再将这 8 位二进制转化为十进制数
  4. 在对应的 base64 映射表中找到对应的映射字符,对于上述第二步不足 6 位补 0 的地方,每两个额外的 0 由 = 字符填充

以 Man 为例,对字符 Man 编码为 base64 的过程如下:

  1. 在 ASCII 编码表找到字符对应的编码,如 M 字符的编码为 77,a 对应的编码为 97,n 对应的编码为 110
  2. 将对应的编码转换为二进制,分别而 01001101,01100001,01101110
  3. 将这些二进制按照每 6 位一组分隔,即 010011,010110,000101,101110
  4. 将 6 位二进制数据用 0 补位凑成 8 位,即 00010011,00010110,00000101,00101110
  5. 将这些 8 位二进制转为十进制,即 19,22,5,46
  6. 在 base64 编码表找到码值对应的字符,即 T,W,F,u

base64编码示例

因此,字符"Man"经过 base64 编码后的值为 TWFu

=填充

TIP

填充=对于 base64 编码是否有必要?因为在解码时又丢弃了填充。

  • 发送单个字符的字符串时不需要填充;
  • 发送多个字符的字符串的 base64 编码时,填充就很重要。如果连接未填充的字符串,则将无法获得原始字符串,因为有关添加的字节的信息将丢失。

看下面的示例:

字符有填充的 base64 编码无填充的 base64 编码
aYQ==YQ
bcYmM==YmM
defZGVmZGVm

当发送连接时没有填充,合并的 base64 字符串将是:YQYmMZGVm,尝试解码时得到的字符串将是 'a&1',是错误的。

当发送连接时使用填充,合并的 base64 字符串将是:YQ==YmM==ZGVm,尝试解码时得到的字符串将是 'abcdef',是正确的。

因此,传输多个字符时使用填充是有必要的。

字符串与 base64 编码转换方法

字符串转换为 base64:window.btoa('')

base64 转换为字符串:window.atob('')

base64 编码解码工具

base64 编码解码工具

ASCII 编码表

Bin(二进制)Oct(八进制)Dec(十进制)Hex(十六进制)缩写/字符解释
0010 0000040320x20(space)空格
0010 0001041330x21!叹号
0010 0010042340x22"双引号
0010 0011043350x23#井号
0010 0100044360x24$美元符
0010 0101045370x25%百分号
0010 0110046380x26&和号
0010 0111047390x27'闭单引号
0010 1000050400x28(开括号
0010 1001051410x29)闭括号
0010 1010052420x2A*星号
0010 1011053430x2B+加号
0010 1100054440x2C,逗号
0010 1101055450x2D-减号/破折号
0010 1110056460x2E.句号
0010 1111057470x2F/斜杠
0011 0000060480x300字符 0
0011 0001061490x311字符 1
0011 0010062500x322字符 2
0011 0011063510x333字符 3
0011 0100064520x344字符 4
0011 0101065530x355字符 5
0011 0110066540x366字符 6
0011 0111067550x377字符 7
0011 1000070560x388字符 8
0011 1001071570x399字符 9
0011 1010072580x3A:冒号
0011 1011073590x3B;分号
0011 1100074600x3C<小于
0011 1101075610x3D=等号
0011 1110076620x3E>大于
0011 1111077630x3F?问号
0100 00000100640x40@电子邮件符号
0100 00010101650x41A大写字母 A
0100 00100102660x42B大写字母 B
0100 00110103670x43C大写字母 C
0100 01000104680x44D大写字母 D
0100 01010105690x45E大写字母 E
0100 01100106700x46F大写字母 F
0100 01110107710x47G大写字母 G
0100 10000110720x48H大写字母 H
0100 10010111730x49I大写字母 I
010010100112740x4AJ大写字母 J
0100 10110113750x4BK大写字母 K
0100 11000114760x4CL大写字母 L
0100 11010115770x4DM大写字母 M
0100 11100116780x4EN大写字母 N
0100 11110117790x4FO大写字母 O
0101 00000120800x50P大写字母 P
0101 00010121810x51Q大写字母 Q
0101 00100122820x52R大写字母 R
0101 00110123830x53S大写字母 S
0101 01000124840x54T大写字母 T
0101 01010125850x55U大写字母 U
0101 01100126860x56V大写字母 V
0101 01110127870x57W大写字母 W
0101 10000130880x58X大写字母 X
0101 10010131890x59Y大写字母 Y
0101 10100132900x5AZ大写字母 Z
0101 10110133910x5B[开方括号
0101 11000134920x5C\反斜杠
0101 11010135930x5D]闭方括号
0101 11100136940x5E^脱字符
0101 11110137950x5F_下划线
0110 00000140960x60`开单引号
0110 00010141970x61a小写字母 a
0110 00100142980x62b小写字母 b
0110 00110143990x63c小写字母 c
0110 010001441000x64d小写字母 d
0110 010101451010x65e小写字母 e
0110 011001461020x66f小写字母 f
0110 011101471030x67g小写字母 g
0110 100001501040x68h小写字母 h
0110 100101511050x69i小写字母 i
0110 101001521060x6Aj小写字母 j
0110 101101531070x6Bk小写字母 k
0110 110001541080x6Cl小写字母 l
0110 110101551090x6Dm小写字母 m
0110 111001561100x6En小写字母 n
0110 111101571110x6Fo小写字母 o
0111 000001601120x70p小写字母 p
0111 000101611130x71q小写字母 q
0111 001001621140x72r小写字母 r
0111 001101631150x73s小写字母 s
0111 010001641160x74t小写字母 t
0111 010101651170x75u小写字母 u
0111 011001661180x76v小写字母 v
0111 011101671190x77w小写字母 w
0111 100001701200x78x小写字母 x
0111 100101711210x79y小写字母 y
0111 101001721220x7Az小写字母 z
0111 101101731230x7B{开花括号
0111 110001741240x7C|垂线
0111 110101751250x7D}闭花括号
0111 111001761260x7E~波浪号
0111 111101771270x7FDEL (delete)删除

如有转载或 CV 的请标注本站原文地址