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

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用
  2. EF框架的三种工作方式
  3. FTP客户端上传下载Demo实现
  4. VC++ 工程添加 Unicode Debug和Unicode Release编译支持
  5. Servlet(Response,Request)
  6. centos安装redis3为系统服务
  7. socket的异步回调函数,采用一问一答
  8. 用Javascript编写Chrome浏览器插件
  9. cocos2d-x学习之自动内存管理
  10. PC/UVa 题号: 110106/10033 Interpreter (解释器)题解 c语言版
  11. HDU5308-脑补-对拍
  12. 使用WeCloud消息推送接口发送消息NodeJs版
  13. 使用SVNkit删除版本库的文件
  14. COM Interop
  15. svn is already locked解决办法
  16. dedecms织梦网站图片集上传图片出现302错误图片提示怎么解决 已测
  17. Tomcat下使用Druid配置JNDI数据源
  18. kafka 暂停消费
  19. React文档(十五)使用propTypes进行类型检查
  20. Jenkins之发送html附件邮件配置

热门文章

  1. Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑
  2. df卡住的解决办法
  3. 设计可靠的udp
  4. Spring Boot的TestRestTemplate使用
  5. 什么是.pyc文件
  6. Netty(二):数据在ChannelPipeline中的流经
  7. MongoDB学习(三)
  8. 是时候实现 SOC 2.0 了
  9. nginx平滑升级、在线添加模块(tengine 动态加载模块)
  10. Codeforces Round #509 (Div. 2) A. Heist 贪心