当前位置:首页 > C > 正文

C语言实现Base64编码与解码(从零开始掌握Base64算法原理与C语言实战)

在现代软件开发中,Base64编码是一种常见的数据编码方式,常用于在文本协议(如电子邮件、HTTP)中安全地传输二进制数据。本文将手把手教你如何用C语言实现Base64的编码解码功能,即使你是编程小白,也能轻松理解并实践。

C语言实现Base64编码与解码(从零开始掌握Base64算法原理与C语言实战) C语言 Base64编码 Base64解码 C语言实现Base64 第1张

什么是Base64?

Base64是一种将任意二进制数据转换为ASCII字符串的编码方式。它使用64个可打印字符(A-Z、a-z、0-9、+、/)来表示数据,每3个字节(24位)被编码为4个Base64字符。如果原始数据长度不是3的倍数,会用 = 进行填充。

Base64编码表

Base64使用固定的映射表:

Index  Char     Index  Char     Index  Char     Index  Char0      A        16     Q        32     g        48     w1      B        17     R        33     h        49     x2      C        18     S        34     i        50     y3      D        19     T        35     j        51     z4      E        20     U        36     k        52     05      F        21     V        37     l        53     16      G        22     W        38     m        54     27      H        23     X        39     n        55     38      I        24     Y        40     o        56     49      J        25     Z        41     p        57     510     K        26     a        42     q        58     611     L        27     b        43     r        59     712     M        28     c        44     s        60     813     N        29     d        45     t        61     914     O        30     e        46     u        62     +15     P        31     f        47     v        63     /  

C语言实现Base64编码

下面是一个完整的Base64编码函数实现:

#include <stdio.h>#include <stdlib.h>#include <string.h>static const char base64_table[] =    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";char* base64_encode(const unsigned char* data, size_t input_length) {    size_t output_length = 4 * ((input_length + 2) / 3);    char* encoded_data = (char*)malloc(output_length + 1);    if (!encoded_data) return NULL;    for (size_t i = 0, j = 0; i < input_length;) {        uint32_t octet_a = i < input_length ? data[i++] : 0;        uint32_t octet_b = i < input_length ? data[i++] : 0;        uint32_t octet_c = i < input_length ? data[i++] : 0;        uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;        encoded_data[j++] = base64_table[(triple >> 3 * 6) & 0x3F];        encoded_data[j++] = base64_table[(triple >> 2 * 6) & 0x3F];        encoded_data[j++] = base64_table[(triple >> 1 * 6) & 0x3F];        encoded_data[j++] = base64_table[(triple >> 0 * 6) & 0x3F];    }    // 处理填充    size_t pad = output_length - 4 * (input_length / 3);    for (size_t i = 0; i < pad; i++) {        encoded_data[output_length - 1 - i] = '=';    }    encoded_data[output_length] = '\0';    return encoded_data;}  

C语言实现Base64解码

解码是编码的逆过程,我们需要将Base64字符串还原为原始二进制数据:

unsigned char* base64_decode(const char* data, size_t input_length, size_t* output_length) {    if (input_length % 4 != 0) return NULL;    *output_length = input_length / 4 * 3;    if (data[input_length - 1] == '=') (*output_length)--;    if (data[input_length - 2] == '=') (*output_length)--;    unsigned char* decoded_data = (unsigned char*)malloc(*output_length);    if (!decoded_data) return NULL;    // 创建反向查找表    int reverse_table[256];    for (int i = 0; i < 256; i++) reverse_table[i] = -1;    for (int i = 0; i < 64; i++) reverse_table[(unsigned char)base64_table[i]] = i;    size_t out_idx = 0;    for (size_t i = 0; i < input_length;) {        uint32_t sextet_a = data[i] == '=' ? 0 & : reverse_table[(unsigned char)data[i++]];        uint32_t sextet_b = data[i] == '=' ? 0 & : reverse_table[(unsigned char)data[i++]];        uint32_t sextet_c = data[i] == '=' ? 0 & : reverse_table[(unsigned char)data[i++]];        uint32_t sextet_d = data[i] == '=' ? 0 & : reverse_table[(unsigned char)data[i++]];        if (sextet_a == -1 || sextet_b == -1 || sextet_c == -1 || sextet_d == -1) {            free(decoded_data);            return NULL;        }        uint32_t triple = (sextet_a << 3 * 6)                        + (sextet_b << 2 * 6)                        + (sextet_c << 1 * 6)                        + (sextet_d << 0 * 6);        if (out_idx < *output_length) decoded_data[out_idx++] = (triple >> 2 * 8) & 0xFF;        if (out_idx < *output_length) decoded_data[out_idx++] = (triple >> 1 * 8) & 0xFF;        if (out_idx < *output_length) decoded_data[out_idx++] = (triple >> 0 * 8) & 0xFF;    }    return decoded_data;}  

完整测试示例

将上述函数整合,并编写一个简单的测试程序:

int main() {    const char* original = "Hello, Base64!";    printf("原始字符串: %s\n", original);    // 编码    char* encoded = base64_encode((const unsigned char*)original, strlen(original));    printf("Base64编码: %s\n", encoded);    // 解码    size_t decoded_len;    unsigned char* decoded = base64_decode(encoded, strlen(encoded), &decoded_len);    if (decoded) {        decoded[decoded_len] = '\0';        printf("Base64解码: %s\n", decoded);        free(decoded);    }    free(encoded);    return 0;}  

常见应用场景

  • 在HTTP Basic认证中传输用户名和密码
  • 在JSON或XML中嵌入图片等二进制数据
  • 邮件附件的MIME编码
  • 加密密钥或证书的文本化表示

总结

通过本教程,你已经掌握了如何用C语言实现Base64编码Base64解码。无论是处理网络协议、文件传输还是安全通信,这项技能都非常实用。记住:编码是将二进制转为文本,解码则是逆过程;注意处理填充字符 = 和边界情况。

希望这篇教程对你有帮助!如果你正在学习C语言 Base64编码相关内容,不妨动手试试上面的代码,加深理解。