小工具知识网

当前位置: 首页 > 行业知识 > 【C语言】C语言编程实战:Base64编解码算法从理论到实现(文末附完整代码)

行业知识

【C语言】C语言编程实战:Base64编解码算法从理论到实现(文末附完整代码)

2026-11-09 12:25:52 来源:互联网转载

文章目录

  • 1. 概述
  • 2. 原理
    • 2.1 Base64编码表
    • 2.2 Base64编码步骤
    • 2.3 Base64解码步骤
    • 3. 核心代码解读
    • 4. 完整代码下载
    • 5. ���结

      1. 概述

      Base64算法是一种基于64个字符的编码算法,常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。该算法使用可打印字符集来表示二进制数据,使得数据可以在文本格式中安全地传输和存储。

      ()

      2. 原理

      为了保证所输出的编码为可读字符,Base64制定了一个由特定ASCII码组成的编码表,以便进行统一编码转换。编码表的大小为2^6=64,这就是Base64名称的由来。

      如下所示,Base64编码表包括A-Z、a-z、0-9、+/共64个可打印字符。

      ()

      2.1 Base64编码表

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

      2.2 Base64编码步骤

      1. 将源数据划分为每3个字节一组,一组组的进行运算。
      2. 将每一组的3个字节转换为二进制,得到24位的数据(如果最后一组源数据不足3字节,不足的部分补0,如M补成M00,Ma补成Ma0)。
      3. 将24位数据按照每6位一组进行重新划分,得到4组长度为6位的新数据。
      4. 将每组6位长度的新数据(高2位补0)转换为10进制数,得到一个范围为[0, 63)之间的数字。4组新数据共得到4个10进制数字。
      5. 拿上一步计算出的4个10进制数字分别去查Base64编码表,得到4个ASCII符号,将其连起来,得到一个4字节长度的字符串,这就是这一组3字节源数据计算得到的base64值了。
      6. 重复步骤2-5,直到计算完成。把每一组3字节源数据计算得到的base64值连接起来。
      7. 如果源数据长度刚好是3的整数倍,那么上一步计算完就得到最终的base64编码了。如果源数据最后一组不足3字节,可能只有1个或2个字节,这时存在2个或者1个填充标记(0),此时需要将上一步计算出的base64编码结尾1到2个字符替换为=,有几个填充标记就就替换为几个=。以标示实际数据只占原来编码的一部分,解码时需要把这部分数据排除掉。

      理论总是抽象的,下面我们直接看例子。

      • 举例子
        1. 假设需要编码的文本字符串是Man(在ASCII中,M=77, a=97, n=110)。

           将字符转换为ASCII值: M a n 77 97 110 将ASCII值转换为二进制: 01001101 01100001 01101110  重新分组为4个6位的单元: 010011 010110 000101 101110  将这些6位的单元转换为十进制: 19 22 5 46  根据Base64索引表找到对应的字符: T W F u

        因此,Man这个字符串的Base64编码结果是TWFu。

        1. 假设我们有一个字符串Ma,它只有两个字节(在ASCII中,M=77, a=97)。

           首先将字符转换为ASCII值,再将ASCII值转换为二进制形式: M a 77 97  01001101 01100001  现在我们只有两个字节,少于一个完整的3字节组。 为了形成一个完整的3字节组,我们需要对最后一个不完整的字节组进行填充。 在这个例子中,我们添加一个字节的填充,即8个比特位的0。  01001101 01100001 00000000  接下来,我们将这个24位的数据重新划分为4个6位的单元:  010011 010110 000100 000000  将这些6位的单元转换为十进制数,然后对照Base64编码表找到相应的字符:  19 22 4 0 T W E A  然而,因为我们进行了填充,所以要在Base64编码后加上等号。 在这个例子中,我们进行了一个字节的填充,所以在Base64编码末尾添加一个等号。

        因此,字符串Ma的Base64编码结果是TWE=。

        1. 假设我们有一个字符串Ma,它只有一个字节(在ASCII中,M=77)。

           首先将字符 "M"转换为ASCII值,并将该值转换为二进制形式:  M 77  二进制: 01001101  现在我们只有一个字节,远少于一个完整的3字节组。为了形成一个完整的3字节组,我们需要对其进行填充。在这个例子中,我们添加两个字节的填充,即16个比特位的0:  01001101 00000000 00000000  接下来,我们将这个24位的数据重新划分为4个6位的单元:  010011 010000 000000 000000  将这些6位的单元转换为十进制数,然后对照Base64编码表找到相应的字符:  19 16 0 0 T Q A A  由于我们进行了填充,所以要在Base64编码后加上两个等号==,以标示实际数据只占原来编码的一部分。在这个例子中,我们进行了两个字节的填充,所以在Base64编码末尾添加两个等号。

        因此,字符串M的Base64编码结果是TQ==。

        2.3 Base64解码步骤

        解码Base64编码的过程与编码相反,将每个Base64字符转换为对应的6位二进制值,然后将这些6 位值组合成原始的二进制数据,再还原回去即可。

        3. 核心代码解读

        1. base64编码表
        char *base64_encodetable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        1. base64最终结果长度计算
        //每3个字节一组转化为4字节//因此计算可以分多少组,将组数乘以4就是编码后的长度codelength = ((length / 3) + (length % 3 > 0 ? 1 : 0)) * 4;
        1. 每3个字节一组转化为4字节并进行计算
        /* * src为源数据 * length为源数据长度 * base64code用于存储最终的base64编码结果 **///每3个字节分一组,调用_base64_section_encode()计算其base64,然后把每一组的base64值拼接起来。for (i = 0; i  
        1. 源数据3字节分组计算base64
        //数字字符串表static char *num_table = "0123456789";/* * char类型数转换为2进制字符串格式, 如2->"10", 6->"110" **/static char *char2binstr(char value){int i = 0;char binstr[9] = {};//取到每一位之后,查表得到对应的字符拼接成一个字符串for (i = 0; i  i];return strdup(binstr);}/* * 2进制字符串格式数据转换为10进制数字,如"10"->2, "110"->6 **/static char binstr2char(char *binstr){int i = 0;char value = 0;int length = 0;if (!binstr)return 0;length = strlen(binstr);//取得2进制字符串的每一个字节,将其转化对应的数字,然后还原数据。for (i = 0; i 

上一篇:宝塔面板好了怎么打开?

下一篇:小型服务器远程存储怎么用?