Base64编码通过查表与位操作将每3字节二进制数据转为4个可打印字符,不足时用’=’填充;解码则逆向还原,需处理非法字符与填充。

在c++中实现Base64编码和解码并不需要依赖第三方库,可以通过查表法结合位操作高效完成。Base64常用于将二进制数据转换为可打印字符,便于在网络传输或文本存储中使用,比如嵌入图片数据或传输加密信息。
Base64编码原理与实现
Base64使用64个可打印字符(A-Z, a-z, 0-9, +, /)表示二进制数据。每3个字节(24位)被拆分为4个6位组,每个组对应一个Base64字符。如果输入长度不是3的倍数,会用’=’进行填充。
编码过程如下:
- 取3个字节共24位,划分为4个6位子组
- 每个6位子组作为索引查找Base64字符表
- 不足3字节时补0,并在结果末尾添加’=’占位
// Base64编码函数示例
立即学习“C++免费学习笔记(深入)”;
const char* base64_chars = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
std::String base64_encode(const unsigned char* data, size_t len) {
std::string ret;
int i = 0;
while (len–) {
if (i % 3 == 0) {
if (len >= 2) {
unsigned char c1 = *data++;
unsigned char c2 = *data++;
unsigned char c3 = *data++;
ret += base64_chars[c1 >> 2];
ret += base64_chars[((c1 & 0x03) > 4)];
ret += base64_chars[((c2 & 0x0f) > 6)];
ret += base64_chars[c3 & 0x3f];
} else {
// 处理末尾不足3字节的情况
break;
}
}
i += 3;
}
// 补齐剩余字节并添加’=’
if (i > len) {
// 实际中需根据剩余字节数补’=’
}
return ret;
}
Base64解码实现方法
解码是编码的逆过程。先将Base64字符转回6位值,再组合成原始字节。需要跳过非法字符(如换行、空格),并对’=’进行特殊处理。
关键点:
- 建立反向查找表,快速获取字符对应的6位值
- 每4个Base64字符还原为3个原始字节
- 遇到’=’时不参与计算,仅表示填充
// 解码辅助表初始化
int base64_index[256];
void init_decode_table() {
for (int i = 0; i for (int i = 0; i base64_index[(unsigned char)base64_chars[i]] = i;
}
std::vector
std::vector
int val = 0, valb = -8;
for (char c : str) {
if (base64_index[(unsigned char)c] == -1) break; // 如遇到’=’或非法字符
val = (val valb += 6;
if (valb >= 0) {
out.push_back((val >> valb) & 0xFF);
valb -= 8;
}
}
return out;
}
使用建议与注意事项
实际项目中可以直接使用成熟库(如Openssl、Poco),但理解手动实现有助于调试和定制需求。
- 注意输入数据边界,避免越界访问
- 处理字符串时考虑’