C:简单实现BaseCode64编码
2024-09-02 20:26:27
What is Base64?
前言
目前来看遇到过Base 16、Base 32、Base 64的编解码,这种编码格式是二进制和文本编码转化,是对称并且可逆的转化。Base 64总共有64个ASCII码字符,包括A-Z,a-z,0-9,“+”和“/ ”。详细介绍可以参考了这篇文章,对Base 64的原理做了比较详细的介绍。
编码原理
转换
Base 64编码的64个ASCII字符需要6位数据,假设将二进制
000000编码为字符 ‘A’
000001编码为字符 ‘B’
000010编码为字符 ‘C’
(当然具体的编码关系需要根据编码表进行映射)
那么一个24 bit的二进制数据
000001 000000 000000 000000
编码后得到
BAAA
不难发现Base 64编码是将 3 x 8 bit 的数据编码为 4 x 6 bit的数据,每个6 bit的数据通过编码表 的映射关系得到一串编码后的字符串。
如果遇到剩下的字符不足3个字节,则用0填充,1个字节或者2个字节的情况,最后用‘=’补齐
编码表
如下图所示
如下 Table[]是自定义的一个编码表,当然表中的字符顺序不是固定,可以变换顺序
char Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
"abcdefghijklmnopqrstuvwxyz"\
"0123456789+/";
编解码实现
编码
void EncodeBase64(char *dst,char *src,int length)
{
int j = 0;
int i = 0;
for ( i=0; i<length; i++)
{
j = i / 3 * 4;
if (i % 3 == 0)
{
if ((length - i) < 3 && (length - i) > 0)
{
dst[j] = Table[((src[i] & 0xFC) >> 2) & 0x3F];
dst[j + 1] = Table[(((src[i] & 0x03) << 4) | ((src[i + 1] & 0xF0) >> 4)) & 0x3F];
switch (length%3)
{
case 1:
dst[j + 2] = '=';
dst[j + 3] = '=';
break;
case 2:
dst[j + 2] = Table[((src[i + 1] & 0x0F)<<2) & 0x3F];;
dst[j + 3] = '=';
break;
default:
break;
}
break;
}
dst[j] = Table[((src[i] & 0xFC) >> 2) & 0x3F];
dst[j + 1] = Table[(((src[i] & 0x03) << 4) | ((src[i + 1] & 0xF0) >> 4)) & 0x3F];
dst[j + 2] = Table[(((src[i + 2] & 0xC0) >> 6) & 0x03) | (((src[i + 1] & 0x0F) << 2))];
dst[j + 3] = Table[(src[i + 2] & 0x3F) & 0x3F];
}
}
}
解码
char FindHexCode(char temp)
{
char *pbuff = Table;
int index = 0;
while (*pbuff != '=')
{
if (temp == pbuff[index])
{
break;
}
index++;
}
return index;
}
void DecodeBase64(char *dst,char *src, int length)
{
int i = 0;
int j = 0;
char temp[4] = { 0 };
for (i=0;i<length;i++)
{
j = i / 4 * 3;
if ( i%4 == 0 )
{
for (int k=0;k<4;k++)
{
temp[k] = FindHexCode(src[i + k]);
}
dst[j] = ((temp[0] << 2) & 0xFC) | ((temp[1] >> 4) & 0x03);
dst[j + 1] = ((temp[1] << 4) & 0xF0) | ((temp[2] >> 2) & 0x0F);
dst[j + 2] = ( (temp[2]<<6) & 0xC0) | temp[3];
}
}
}
测试
int main()
{
char buff[1024] = { 0 };
char test[] = "www.greywalltech.com";
char Result[1024] = { 0 };
EncodeBase64(buff,test, strlen(test));
std::cout << "Base 64 Encode:" << buff << std::endl;
DecodeBase64(Result,buff,strlen(buff));
std::cout << "Base 64 Decode:" << Result << std::endl;
return 0;
}
使用相同的编码表,在线进行编码生成的base64加密结果如下图所示:
完整代码下载
http://download.csdn.net/detail/u010632165/9681969
最新文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用
- EF框架的三种工作方式
- FTP客户端上传下载Demo实现
- VC++ 工程添加 Unicode Debug和Unicode Release编译支持
- Servlet(Response,Request)
- centos安装redis3为系统服务
- socket的异步回调函数,采用一问一答
- 用Javascript编写Chrome浏览器插件
- cocos2d-x学习之自动内存管理
- PC/UVa 题号: 110106/10033 Interpreter (解释器)题解 c语言版
- HDU5308-脑补-对拍
- 使用WeCloud消息推送接口发送消息NodeJs版
- 使用SVNkit删除版本库的文件
- COM Interop
- svn is already locked解决办法
- dedecms织梦网站图片集上传图片出现302错误图片提示怎么解决 已测
- Tomcat下使用Druid配置JNDI数据源
- kafka 暂停消费
- React文档(十五)使用propTypes进行类型检查
- Jenkins之发送html附件邮件配置
热门文章
- Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑
- df卡住的解决办法
- 设计可靠的udp
- Spring Boot的TestRestTemplate使用
- 什么是.pyc文件
- Netty(二):数据在ChannelPipeline中的流经
- MongoDB学习(三)
- 是时候实现 SOC 2.0 了
- nginx平滑升级、在线添加模块(tengine 动态加载模块)
- Codeforces Round #509 (Div. 2) A. Heist 贪心