实现Base64编码与解码 c++
时间: 2024-01-27 10:02:42 浏览: 84
c++ base64 编码工具
以下是一个简单的Base64编码和解码实现的C程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 = malloc(output_length + 1);
if (encoded_data == NULL) 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];
}
for (size_t i = 0; i < input_length % 3; i++) {
encoded_data[output_length - 1 - i] = '=';
}
encoded_data[output_length] = '\0';
return encoded_data;
}
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 = malloc(*output_length);
if (decoded_data == NULL) return NULL;
for (size_t i = 0, j = 0; i < input_length;) {
uint32_t sextet_a = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]];
uint32_t sextet_b = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]];
uint32_t sextet_c = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]];
uint32_t sextet_d = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]];
uint32_t triple = (sextet_a << 3 * 6)
+ (sextet_b << 2 * 6)
+ (sextet_c << 1 * 6)
+ (sextet_d << 0 * 6);
if (j < *output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
}
return decoded_data;
}
int main() {
const char* input = "Hello, world!";
size_t input_length = strlen(input);
char* encoded_data = base64_encode((const unsigned char*)input, input_length);
printf("Encoded data: %s\n", encoded_data);
size_t output_length;
unsigned char* decoded_data = base64_decode(encoded_data, strlen(encoded_data), &output_length);
printf("Decoded data: %s\n", decoded_data);
free(encoded_data);
free(decoded_data);
return 0;
}
```
程序首先定义了一个Base64字符表,包含了所有可能的Base64字符。然后实现了两个函数,分别是Base64编码和解码函数。
Base64编码函数将输入数据按照每3个字节一组进行处理,将每组字节转换成4个Base64字符。如果输入数据不是3的倍数,则在末尾加上相应数量的0字节,以使其能够被3整除。最后,函数将转换后的字符串末尾补上相应数量的=字符。
Base64解码函数将输入数据按照每4个字符一组进行处理,将每组字符转换成3个字节。如果末尾有=字符,则说明输入数据被填充了,需要在解码后去掉填充的0字节。
在程序中,我们将一个字符串进行Base64编码,然后再将编码后的字符串解码回原始字符串,最后输出结果。在输出解码后的数据时,我们将其当作一个字符串输出,可能会出现乱码,这是因为转换后的数据可能包含了0字节,而字符串输出函数会在遇到0字节时停止输出。如果需要输出二进制数据,应该使用fwrite函数来输出。
阅读全文