1、使用开源库(如 OpenSSL)
OpenSSL 库提供了一个易于使用的 API 来进行 Base64 编解码。如未安装,Linux 中,通常可以通过包管理器安装 OpenSSL。
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
// 编码函数
char *base64_encode(const unsigned char *input, int length) {
int encoded_length = 4 * ((length + 2) / 3); // Base64 编码输出的长度
char *encoded = malloc(encoded_length + 1); // 包含结束符 '\0'
EVP_EncodeBlock((unsigned char*)encoded, input, length);
return encoded;
}
// 解码函数
unsigned char *base64_decode(const char *input, int *length) {
int decoded_length = (strlen(input) * 3) / 4;
unsigned char *decoded = malloc(decoded_length);
*length = EVP_DecodeBlock(decoded, (unsigned char*)input, strlen(input));
return decoded;
}
int main() {
// 示例:Base64 编码
unsigned char input[] = "Hello, World!";
int input_length = strlen((char *)input);
// 编码
char *encoded = base64_encode(input, input_length);
printf("Encoded: %s\n", encoded);
// 解码
int decoded_length;
unsigned char *decoded = base64_decode(encoded, &decoded_length);
printf("Decoded: %.*s\n", decoded_length, decoded);
// 释放内存
free(encoded);
free(decoded);
return 0;
}
2、自定义实现 Base64 编码和解码
如果不想依赖外部库,可以使用一个简单的 Base64 编码和解码函数。
1)Base64 编码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// 编码函数
char* base64_encode(const unsigned char *input, int length) {
int encoded_length = 4 * ((length + 2) / 3); // 计算编码后的长度
char *encoded = malloc(encoded_length + 1); // +1 用于 '\0' 结尾
int i, j = 0;
unsigned char temp[3];
for (i = 0; i < length;) {
temp[0] = input[i++];
temp[1] = (i < length) ? input[i++] : 0;
temp[2] = (i < length) ? input[i++] : 0;
encoded[j++] = base64_table[temp[0] >> 2];
encoded[j++] = base64_table[((temp[0] & 0x03) << 4) | (temp[1] >> 4)];
encoded[j++] = (i > length + 1) ? '=' : base64_table[((temp[1] & 0x0F) << 2) | (temp[2] >> 6)];
encoded[j++] = (i > length) ? '=' : base64_table[temp[2] & 0x3F];
}
encoded[j] = '\0';
return encoded;
}
2)Base64 解码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static const int base64_decode_table[256] = {
// 非 Base64 字符都映射为 -1
// 用于解码的字符集
// 'A'-'Z': 0-25, 'a'-'z': 26-51, '0'-'9': 52-61, '+' = 62, '/' = 63, '=' = -1
['A'] = 0, ['B'] = 1, ['C'] = 2, ['D'] = 3, ['E'] = 4, ['F'] = 5, ['G'] = 6, ['H'] = 7, ['I'] = 8, ['J'] = 9,
['K'] = 10, ['L'] = 11, ['M'] = 12, ['N'] = 13, ['O'] = 14, ['P'] = 15, ['Q'] = 16, ['R'] = 17, ['S'] = 18, ['T'] = 19,
['U'] = 20, ['V'] = 21, ['W'] = 22, ['X'] = 23, ['Y'] = 24, ['Z'] = 25,
['a'] = 26, ['b'] = 27, ['c'] = 28, ['d'] = 29, ['e'] = 30, ['f'] = 31, ['g'] = 32, ['h'] = 33, ['i'] = 34, ['j'] = 35,
['k'] = 36, ['l'] = 37, ['m'] = 38, ['n'] = 39, ['o'] = 40, ['p'] = 41, ['q'] = 42, ['r'] = 43, ['s'] = 44, ['t'] = 45,
['u'] = 46, ['v'] = 47, ['w'] = 48, ['x'] = 49, ['y'] = 50, ['z'] = 51,
['0'] = 52, ['1'] = 53, ['2'] = 54, ['3'] = 55, ['4'] = 56, ['5'] = 57, ['6'] = 58, ['7'] = 59, ['8'] = 60, ['9'] = 61,
['+'] = 62, ['/'] = 63
};
// 解码函数
unsigned char* base64_decode(const char* input, int* length) {
int len = strlen(input);
int output_length = len * 3 / 4;
unsigned char *decoded = malloc(output_length);
int i, j = 0;
unsigned char temp[4];
for (i = 0; i < len; i += 4) {
temp[0] = base64_decode_table[(unsigned char)input[i]];
temp[1] = base64_decode_table[(unsigned char)input[i+1]];
temp[2] = base64_decode_table[(unsigned char)input[i+2]];
temp[3] = base64_decode_table[(unsigned char)input[i+3]];
decoded[j++] = (temp[0] << 2) | (temp[1] >> 4);
decoded[j++] = (temp[1] << 4) | (temp[2] >> 2);
decoded[j++] = (temp[2] << 6) | temp[3];
}
*length = j; // 返回解码后的数据长度
return decoded;
}
3)完整示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// 编码函数
char* base64_encode(const unsigned char *input, int length) {
int encoded_length = 4 * ((length + 2) / 3); // 计算编码后的长度
char *encoded = malloc(encoded_length + 1); // +1 用于 '\0' 结尾
int i, j = 0;
unsigned char temp[3];
for (i = 0; i < length;) {
temp[0] = input[i++];
temp[1] = (i < length) ? input[i++] : 0;
temp[2] = (i < length) ? input[i++] : 0;
encoded[j++] = base64_table[temp[0] >> 2];
encoded[j++] = base64_table[((temp[0] & 0x03) << 4) | (temp[1] >> 4)];
encoded[j++] = (i > length + 1) ? '=' : base64_table[((temp[1] & 0x0F) << 2) | (temp[2] >> 6)];
encoded[j++] = (i > length) ? '=' : base64_table[temp[2] & 0x3F];
}
encoded[j] = '\0';
return encoded;
}
static const int base64_decode_table[256] = {
// 非 Base64 字符都映射为 -1
// 用于解码的字符集
// 'A'-'Z': 0-25, 'a'-'z': 26-51, '0'-'9': 52-61, '+' = 62, '/' = 63, '=' = -1
['A'] = 0, ['B'] = 1, ['C'] = 2, ['D'] = 3, ['E'] = 4, ['F'] = 5, ['G'] = 6, ['H'] = 7, ['I'] = 8, ['J'] = 9,
['K'] = 10, ['L'] = 11, ['M'] = 12, ['N'] = 13, ['O'] = 14, ['P'] = 15, ['Q'] = 16, ['R'] = 17, ['S'] = 18, ['T'] = 19,
['U'] = 20, ['V'] = 21, ['W'] = 22, ['X'] = 23, ['Y'] = 24, ['Z'] = 25,
['a'] = 26, ['b'] = 27, ['c'] = 28, ['d'] = 29, ['e'] = 30, ['f'] = 31, ['g'] = 32, ['h'] = 33, ['i'] = 34, ['j'] = 35,
['k'] = 36, ['l'] = 37, ['m'] = 38, ['n'] = 39, ['o'] = 40, ['p'] = 41, ['q'] = 42, ['r'] = 43, ['s'] = 44, ['t'] = 45,
['u'] = 46, ['v'] = 47, ['w'] = 48, ['x'] = 49, ['y'] = 50, ['z'] = 51,
['0'] = 52, ['1'] = 53, ['2'] = 54, ['3'] = 55, ['4'] = 56, ['5'] = 57, ['6'] = 58, ['7'] = 59, ['8'] = 60, ['9'] = 61,
['+'] = 62, ['/'] = 63
};
// 解码函数
unsigned char* base64_decode(const char* input, int* length) {
int len = strlen(input);
int output_length = len * 3 / 4;
unsigned char *decoded = malloc(output_length);
int i, j = 0;
unsigned char temp[4];
for (i = 0; i < len; i += 4) {
temp[0] = base64_decode_table[(unsigned char)input[i]];
temp[1] = base64_decode_table[(unsigned char)input[i+1]];
temp[2] = base64_decode_table[(unsigned char)input[i+2]];
temp[3] = base64_decode_table[(unsigned char)input[i+3]];
decoded[j++] = (temp[0] << 2) | (temp[1] >> 4);
decoded[j++] = (temp[1] << 4) | (temp[2] >> 2);
decoded[j++] = (temp[2] << 6) | temp[3];
}
*length = j; // 返回解码后的数据长度
return decoded;
}
int main() {
const unsigned char input[] = "Hello, World!";
int input_len = strlen((const char *)input);
// 编码
char *encoded = base64_encode(input, input_len);
printf("Encoded: %s\n", encoded);
// 解码
int decoded_len;
unsigned char *decoded = base64_decode(encoded, &decoded_len);
printf("Decoded: %.*s\n", decoded_len, decoded);
// 释放内存
free(encoded);
free(decoded);
return 0;
}