使用 OpenSSL API 实现 Base64 编解码可以通过 BIO
和 EVP
接口来完成。以下是一个简单的示例代码,展示如何进行 Base64 编码和解码。
编码和解码示例
#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
// Base64 编码
char* base64_encode(const unsigned char* input, int length) {
BIO *bio, *b64;
BUF_MEM *buffer_ptr;
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, &buffer_ptr);
// 分配内存并复制编码后的字符串
char* encoded_data = (char*)malloc(buffer_ptr->length + 1);
memcpy(encoded_data, buffer_ptr->data, buffer_ptr->length);
encoded_data[buffer_ptr->length] = '\0'; // 添加 null 终止符
BIO_free_all(bio);
return encoded_data;
}
// Base64 解码
unsigned char* base64_decode(const char* input, int* output_length) {
BIO *bio, *b64;
int decode_len = strlen(input);
unsigned char* buffer = (unsigned char*)malloc(decode_len);
b64 = BIO_new(BIO_f_base64());
bio = BIO_new_mem_buf((void*)input, decode_len);
bio = BIO_push(b64, bio);
// 将数据从Base64解码到buffer中
*output_length = BIO_read(bio, buffer, decode_len);
BIO_free_all(bio);
return buffer;
}
int main() {
const char* original_text = "Hello World!";
// 编码
char* encoded_text = base64_encode((const unsigned char*)original_text, strlen(original_text));
printf("Encoded: %s\n", encoded_text);
// 解码
int decoded_length;
unsigned char* decoded_text = base64_decode(encoded_text, &decoded_length);
printf("Decoded: %.*s\n", decoded_length, decoded_text);
// 清理分配的内存
free(encoded_text);
free(decoded_text);
return 0;
}
注意事项
编译:确保你的系统已经安装了 OpenSSL 库,并使用以下命令编译该程序:
gcc -o base64_example base64_example.c -lssl -lcrypto
包含文件:在代码中,我们引入了
<openssl/bio.h>
和<openssl/evp.h>
,这些头文件提供了实现 Base64 功能所需的接口。内存管理:在使用完编码或解码后,要记得释放分配的内存,以防止内存泄漏。
错误处理:上述代码没有添加错误处理逻辑。在生产代码中,建议根据需要添加相应的检查和处理,以保证健壮性。
内容由零声教学AI助手提供,问题来源于学员提问