C语言如何实现base64编码?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 C语言 正文

Base64 编码在 C 语言中的实现

Base64 是一种将二进制数据转换为文本字符串的编码方式,常用于在文本协议中传输二进制数据,下面我将介绍几种在 C 语言中实现 Base64 编码的方法。

base64encode c语言
(图片来源网络,侵删)

手动实现 Base64 编码

以下是一个完整的 Base64 编码实现:

#include <stdio.h>
#include <string.h>
// Base64 编码表
static const char base64_table[] = 
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// 计算编码后的长度
size_t base64_encoded_length(size_t input_length) {
    return (input_length + 2) / 3 * 4;
}
// Base64 编码函数
void base64_encode(const unsigned char *input, size_t length, char *output) {
    size_t i, j;
    unsigned char chunk[3];
    for (i = 0, j = 0; i < length; i += 3) {
        chunk[0] = input[i];
        chunk[1] = (i + 1 < length) ? input[i + 1] : 0;
        chunk[2] = (i + 2 < length) ? input[i + 2] : 0;
        output[j++] = base64_table[chunk[0] >> 2];
        output[j++] = base64_table[((chunk[0] & 0x03) << 4) | (chunk[1] >> 4)];
        output[j++] = (i + 1 < length) ? base64_table[((chunk[1] & 0x0F) << 2) | (chunk[2] >> 6)] : '=';
        output[j++] = (i + 2 < length) ? base64_table[chunk[2] & 0x3F] : '=';
    }
    output[j] = '\0';
}
int main() {
    const char *input = "Hello, World!";
    size_t length = strlen(input);
    size_t encoded_length = base64_encoded_length(length);
    char encoded[encoded_length + 1]; // +1 for null terminator
    base64_encode((const unsigned char *)input, length, encoded);
    printf("Original: %s\n", input);
    printf("Encoded:  %s\n", encoded);
    return 0;
}

使用 OpenSSL 库

如果你可以使用 OpenSSL 库,这是更简单和可靠的方法:

#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
char *base64_encode_openssl(const unsigned char *input, size_t length) {
    BIO *bio, *b64;
    BUF_MEM *bufferPtr;
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(bio, input, length);
    BIO_flush(bio);
    BIO_get_mem_ptr(bio, &bufferPtr);
    char *encoded = strndup(bufferPtr->data, bufferPtr->length);
    BIO_free_all(bio);
    return encoded;
}
int main() {
    const char *input = "Hello, World!";
    size_t length = strlen(input);
    char *encoded = base64_encode_openssl((const unsigned char *)input, length);
    printf("Original: %s\n", input);
    printf("Encoded:  %s\n", encoded);
    free(encoded);
    return 0;
}

使用标准库函数(POSIX)

在 POSIX 系统上,可以使用标准库函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
size_t base64_encoded_length(size_t input_length) {
    return (input_length + 2) / 3 * 4;
}
int main() {
    const char *input = "Hello, World!";
    size_t length = strlen(input);
    size_t encoded_length = base64_encoded_length(length);
    char *encoded = malloc(encoded_length + 1);
    if (!encoded) {
        perror("malloc failed");
        return 1;
    }
    // 使用 POSIX 的 base64 编码函数
    if (B64Encode(input, length, encoded, encoded_length) == -1) {
        fprintf(stderr, "Base64 encoding failed\n");
        free(encoded);
        return 1;
    }
    printf("Original: %s\n", input);
    printf("Encoded:  %s\n", encoded);
    free(encoded);
    return 0;
}

注意事项

  1. 手动实现时要注意处理输入长度不是3的倍数的情况(需要填充'=')
  2. OpenSSL 方法是最可靠的,但需要链接 OpenSSL 库(-lcrypto
  3. 标准库方法在不同系统上可能不可用
  4. 编码后的字符串会比原始数据长约33%
  5. Base64 编码不是加密,只是编码方式

选择哪种方法取决于你的具体需求和运行环境,如果只是简单使用,手动实现就足够了;如果需要更可靠或更高效的处理,建议使用 OpenSSL 库。

base64encode c语言
(图片来源网络,侵删)
base64encode c语言
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
windows下c语言多线程编程
« 上一篇 2025-12-22
Linux C如何实现一个简易Shell?
下一篇 » 2025-12-22

相关文章

取消
微信二维码
支付宝二维码

目录[+]