C语言编程实战:Base64编解码算法从理论到实现(附完整代码)
1. 概述
Base64算法是一种基于64个字符的编码算法,常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。该算法使用可打印字符集来表示二进制数据,使得数据可以在文本格式中安全地传输和存储。
2. 原理
为了保证所输出的编码为可读字符,Base64制定了一个由特定ASCII码组成的编码表,以便进行统一编码转换。编码表的大小为2^6=64
,这就是Base64名称的由来。
如下所示,Base64编码表包括A-Z
、a-z
、0-9
、+/
共64个可打印字符。
2.1 Base64编码表
码值 | 字符 | | | 码值 | 字符 | | | 码值 | 字符 | | | 码值 | 字符 |
---|---|---|---|---|---|---|---|---|---|---|
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 | / |
2.2 Base64编码步骤
- 将源数据划分为每
3
个字节一组,一组组的进行运算。 - 将每一组的
3
个字节转换为二进制,得到24
位的数据(如果最后一组源数据不足3
字节,不足的部分补0
,如M
补成M00
,Ma
补成Ma0
)。 - 将
24
位数据按照每6
位一组进行重新划分,得到4
组长度为6
位的新数据。 - 将每组
6
位长度的新数据(高2位补0)转换为10进制数,得到一个范围为[0, 63)
之间的数字。4组新数据共得到4
个10进制数字。 - 拿上一步计算出的
4
个10进制数字分别去查Base64编码表,得到4
个ASCII符号,将其连起来,得到一个4
字节长度的字符串,这就是这一组3
字节源数据计算得到的base64值了。 - 重复步骤
2-5
,直到计算完成。把每一组3字节源数据计算得到的base64值连接起来。 - 如果源数据长度刚好是3的整数倍,那么上一步计算完就得到最终的base64编码了。如果源数据最后一组不足3字节,可能只有
1
个或2
个字节,这时存在2
个或者1
个填充标记(0
),此时需要将上一步计算出的base64编码结尾1到2个字符替换为=
,有几个填充标记就就替换为几个=
。以标示实际数据只占原来编码的一部分,解码时需要把这部分数据排除掉。
理论总是抽象的,下面我们直接看例子。
- 举例子
-
假设需要编码的文本字符串是
Man
(在ASCII中,M=77, a=97, n=110)。