什么是Base64


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/03/04/%E4%BB%80%E4%B9%88%E6%98%AFBase64/

摘要

本文主要讲述了:

  1. 什么是 Base64
  2. Base64 码表
  3. 编码原理
  4. 解码原理

正文

什么是 Base64

Base64 是一种使用可打印字符来表示二进制数据的字符编码方案。

1 个 Base64 字符用 6 个二进制位表示。

Base64 将 3 个字节编码为 4 个 Base64 字符。

Base64 码表

Bin Dec Hex Char
0000 0000 0 00 A
0000 0001 1 01 B
0000 0010 2 02 C
0001 1001 25 19 Z
0001 1010 26 1A a
0001 1011 27 1B b
0001 1100 28 1C c
0011 0011 51 33 z
0011 0100 52 34 0
0011 0101 53 35 1
0011 0110 54 36 2
0011 1101 61 3D 9
0011 1110 62 3E +
0011 1111 63 3F /

此外,=用作后缀。

编码原理

  1. 根据 ASCII 码表,每次取出 3 个字节(若不足 3 字节,则全部取出),获得对应的二进制 ASCII 码点
  2. 根据 Base64 码表,每次取出 6 位,换算为对应的 Base64 字符。若不足 6 位,剩余的二进制 ASCII 码点左移补 0。每左移 2 位就在 Base64 编码后增加 1 个=

示例:将eng进行 Base64 编码

  1. 根据 ASCII 码表,e的二进制 ASCII 码点为01100101
  2. 根据 ASCII 码表,n的二进制 ASCII 码点为01101110
  3. 根据 ASCII 码表,g的二进制 ASCII 码点为01100111
  4. 整理获得:01100101 01101110 01100111
  5. 每次取出 6 位,整理获得:011001 010110 111001 100111
  6. 根据 Base64 码表,011001的 Base64 字符为Z
  7. 根据 Base64 码表,010110的 Base64 字符为W
  8. 根据 Base64 码表,111001的 Base64 字符为5
  9. 根据 Base64 码表,100111的 Base64 字符为n
  10. 整理获得:ZW5n

示例:将en进行 Base64 编码

  1. 根据 ASCII 码表,e的二进制 ASCII 码点为01100101
  2. 根据 ASCII 码表,n的二进制 ASCII 码点为01101110
  3. 整理获得:01100101 01101110
  4. 每次取出 6 位,整理获得:011001 010110 1110
  5. 根据 Base64 码表,011001的 Base64 字符为Z
  6. 根据 Base64 码表,010110的 Base64 字符为W
  7. 1110不足 6 位,左移 2 位,获得111000
  8. 根据 Base64 码表,111000的 Base64 字符为4
  9. 由于左移 2 位,需在 Base64 编码后增加 1 个=
  10. 整理获得:ZW4=

示例:将e进行 Base64 编码

  1. 根据 ASCII 码表,e的二进制 ASCII 码点为01100101
  2. 整理获得:01100101
  3. 每次取出 6 位,整理获得:011001 01
  4. 根据 Base64 码表,011001的 Base64 字符为Z
  5. 01不足 6 位,左移 4 位,获得010000
  6. 根据 Base64 码表,010000的 Base64 字符为Q
  7. 由于左移 4 位,需在 Base64 编码后增加 2 个=
  8. 整理获得:ZQ==

解码原理

  1. 根据 Base64 码表,每次取出 4 个 Base64 字符(若不足 4 个,则全部取出),获得对应的二进制 Base64 码点。若有结尾有 n 个=,则将最后 1 个 Base64 字符的二进制 Base64 码点右移 2n 位
  2. 根据 ASCII 码表,每次取出 8 位,换算为对应的 ASCII 字符

示例:将ZW5n进行 Base64 解码。

  1. 根据 Base64 码表,Z的二进制 Base64 码点为011001
  2. 根据 Base64 码表,W的二进制 Base64 码点为010110
  3. 根据 Base64 码表,5的二进制 Base64 码点为111001
  4. 根据 Base64 码表,n的二进制 Base64 码点为100111
  5. 整理获得:011001 010110 111001 100111
  6. 每次取出 8 位,整理获得:01100101 01101110 01100111
  7. 根据 ASCII 码表,01100101的 ASCII 字符为e
  8. 根据 ASCII 码表,01101110的 ASCII 字符为n
  9. 根据 ASCII 码表,01100111的 ASCII 字符为g
  10. 整理获得:eng

示例:将ZW4=进行 Base64 解码。

  1. 根据 Base64 码表,Z的二进制 Base64 码点为011001
  2. 根据 Base64 码表,W的二进制 Base64 码点为010110
  3. 根据 Base64 码表,4的二进制 Base64 码点为111000
  4. 由于有 1 个=111000需要右移 2 位,获得1110
  5. 整理获得:011001 010110 1110
  6. 每次取出 8 位,整理获得:01100101 01101110
  7. 根据 ASCII 码表,01100101的 ASCII 字符为e
  8. 根据 ASCII 码表,01101110的 ASCII 字符为n
  9. 整理获得:en

示例:将ZQ==进行 Base64 解码。

  1. 根据 Base64 码表,Z的二进制 Base64 码点为011001
  2. 根据 Base64 码表,Q的二进制 Base64 码点为010000
  3. 由于有 2 个=010000需要右移 4 位,获得01
  4. 整理获得:011001 01
  5. 每次取出 8 位,整理获得:01100101
  6. 根据 ASCII 码表,01100101的 ASCII 字符为e
  7. 整理获得:e

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/03/04/%E4%BB%80%E4%B9%88%E6%98%AFBase64/


本文对你有帮助?请支持我


支付宝
微信