博客
关于我
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/

你可能感兴趣的文章
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>