博客
关于我
base64编解码的两个函数
阅读量:781 次
发布时间:2019-03-24

本文共 2439 字,大约阅读时间需要 8 分钟。

base64编码解码函数实现

base64是一种基于ASCII字符的传输编码方法,广泛应用于数据的压缩和保留。以下是base64编码和解码的实现代码,以及详细说明。

base64编码函数

unsigned char *base64_encode(unsigned char *str, long* lpBufLen)
{
const unsigned char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
long str_len = strlen((char*)str);
// 计算编码后的长度
long len = (str_len % 3 == 0) ? str_len / 3 * 4 : (str_len / 3 + 1) * 4;
// 提示用户分配内存
if (lpBufLen != NULL)
{
*lpBufLen = len;
}
// 分配编码结果
unsigned char *res = (unsigned char*)malloc(len + 1);
res[len] = '\0';
// 径向过程
for (long i = 0, j = 0; i < len - 2; j += 3, i += 4)
{
// 取出三字节进行编码
unsigned char a = str[j], b = str[j+1], c = str[j+2];
// 取出每组的六个二进制位
unsigned char v = (c >> 6) | (b >> 2) | (a >> 0);
unsigned char v1 = (c >> 2) | (b >> 4);
unsigned char v2 = (c << 2) | a;
unsigned char v3 = c >> 6;
res[i] = base64_table[v3];
res[i+1] = base64_table[v1];
res[i+2] = base64_table[(v2 & 0b00001111)];
// 添加等号填充
if (i == len - 4)
{
res[i+4] = '=';
res[i+5] = '=';
}
}
// 处理最后的填充
if (str_len % 3 != 0)
{
res[len-2] = '=';
res[len-1] = '=';
}
return res;
}

base64解码函数

unsigned char *base64_decode(unsigned char *code, long* lpBufLen)
{
int table[] = [ ... ]; // 伪代码示例
long len = strlen((char*)code);
long str_len = len;
// 计算解码后的长度
str_len = (str_len % 4 == 2 ? str_len : (str_len % 4 == 1 ? str_len + 2 : str_len));
if (lpBufLen != NULL)
{
*lpBufLen = str_len;
}
unsigned char *res = (unsigned char*)malloc(str_len + 1);
res[str_len] = '\0';
// 解码过程
for (long i = 0; i < len - 3; i += 4)
{
unsigned char v1 = code[i], v2 = code[i+1], v3 = code[i+2], v4 = code[i+3];
unsigned char a = (v3 & 0b100000) | (v2 >> 4) | (v1 >> 6);
unsigned char b = (v3 & 0b011111) | (v2 << 2);
long c = ((v1 & 0b111) << 8) | v4;
unsigned char ch = table[c / 4 * 62 + 26 + 1];
unsigned char ch2 = table[c % 4 * 62 + 26];
if (i == len - 4)
{
res[i+2] = ch = '=';
res[i+3] = ch2 = '=';
}
}
return res;
}

这两个函数实现了base64编码和解码功能,适用于将二进制数据转换为可传输的ASCII字符,反之亦能进行解码。

转载地址:http://gczuk.baihongyu.com/

你可能感兴趣的文章
MySQL Workbench 使用手册:从入门到精通
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
MySQL —— 视图
查看>>
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>
MySQL 中文问题
查看>>
MySQL 中日志的面试题总结
查看>>
mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
查看>>
MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
查看>>
Mysql 中的日期时间字符串查询
查看>>
mysql 中索引的问题
查看>>
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>