Base64是常见的加密算法,代码实现了基于C++的对于base64的编码和解码。

其中注释掉的部分为编码部分,取消注释将解码部分注释掉即可实现编码,反之可以实现解码。

 #include <stdio.h>
#include <string.h>
#include <assert.h> typedef unsigned char uint8;
typedef unsigned long uint32; static uint8 alphabet_map[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static uint8 reverse_map[] =
{
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , ,
}; uint32 base64_encode(const uint8 *text, uint32 text_len, uint8 *encode)
{
uint32 i, j;
for (i = , j = ; i+ <= text_len; i+=)
{
encode[j++] = alphabet_map[text[i]>>]; //取出第一个字符的前6位并找出对应的结果字符
encode[j++] = alphabet_map[((text[i]<<)&0x30)|(text[i+]>>)]; //将第一个字符的后2位与第二个字符的前4位进行组合并找到对应的结果字符
encode[j++] = alphabet_map[((text[i+]<<)&0x3c)|(text[i+]>>)]; //将第二个字符的后4位与第三个字符的前2位组合并找出对应的结果字符
encode[j++] = alphabet_map[text[i+]&0x3f]; //取出第三个字符的后6位并找出结果字符
} if (i < text_len)
{
uint32 tail = text_len - i;
if (tail == )
{
encode[j++] = alphabet_map[text[i]>>];
encode[j++] = alphabet_map[(text[i]<<)&0x30];
encode[j++] = '=';
encode[j++] = '=';
}
else //tail==2
{
encode[j++] = alphabet_map[text[i]>>];
encode[j++] = alphabet_map[((text[i]<<)&0x30)|(text[i+]>>)];
encode[j++] = alphabet_map[(text[i+]<<)&0x3c];
encode[j++] = '=';
}
}
return j;
} uint32 base64_decode(const uint8 *code, uint32 code_len, uint8 *plain)
{
assert((code_len&0x03) == ); //如果它的条件返回错误,则终止程序执行。4的倍数。 uint32 i, j = ;
uint8 quad[];
for (i = ; i < code_len; i+=)
{
for (uint32 k = ; k < ; k++)
{
quad[k] = reverse_map[code[i+k]];//分组,每组四个分别依次转换为base64表内的十进制数
} assert(quad[]< && quad[]<); plain[j++] = (quad[]<<)|(quad[]>>); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的前2位进行组合 if (quad[] >= )
break;
else if (quad[] >= )
{
plain[j++] = (quad[]<<)|(quad[]>>); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应base64表的十进制数的前4位进行组合
break;
}
else
{
plain[j++] = (quad[]<<)|(quad[]>>);
plain[j++] = (quad[]<<)|quad[];//取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合
}
}
return j;
} /*int main(void)
{
char input[256];
while (true){
printf("Please input string: ");
scanf("%s", input);
uint8 *text = (uint8 *)input;
uint32 text_len = (uint32)strlen((char *)text);
uint8 buffer[1024], buffer2[4096];
uint32 size = base64_encode(text, text_len, buffer2);
buffer2[size] = 0;
printf("%s\n", buffer2); size = base64_decode(buffer2, size, buffer);
buffer[size] = 0;
printf("%s\n", buffer); }
return 0;
}*/
//编码
int main(void)
{
char input[];
while (true){
printf("Please input what you want to decode: ");
scanf("%s", input);
uint8 *text = (uint8 *)input;
uint32 text_len = (uint32)strlen((char *)text);
uint8 buffer[],buffer2[]; uint32 size = base64_decode(text, text_len, buffer);
buffer[size] = ;
printf("Decoded content: %s\n", buffer);
size = base64_encode(buffer, size, buffer2);
buffer2[size] = ;
printf("Confirmation of the original content: %s\n", buffer2);
}
return ;
}
//解码

最新文章

  1. Socket编程——怎么实现一个服务器多个客户端之间的连接
  2. iOS 实现类似雷达效果的核心代码
  3. 使用git error: RPC failed; result=22, HTTP code = 411
  4. ajax 如何提交数据到后台jsp页面,以及提交完跳转到jsp页面
  5. Xcode 7遇到 App Transport Security has blocked a cleartext HTTP 错误
  6. 【BZOJ】【2480】【SPOJ 3105】Mod
  7. Mybatis配置中遇到的问题和问题分析
  8. firefly笔记一之http模块
  9. swift-switch使用方法
  10. thymeleaf模板引擎shiro集成框架
  11. 矩阵的f范数及其求偏导法则
  12. UML图学习之二 类图
  13. [线段树]HDU-1754板子题入门ver
  14. android 使用Canvas画箭头
  15. 将preg_replace()改写为preg_replace_callback()
  16. js去除数组重复成员
  17. 【转】SQL Server 事务隔离级别详解
  18. js 功能
  19. IQR(Inter-Quartile Range)
  20. 小程序 textarea

热门文章

  1. Jupyter的快捷键使用
  2. P4141 消失之物
  3. 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量
  4. ssl 原理简介
  5. python .md5 加密
  6. yarn一些最佳配置
  7. [Gamma阶段]第十次Scrum Meeting
  8. APP测试要点整理
  9. 【Laravel基础】laravel基础之相关概念,自定义服务提供者:Contracts, ServiceContainer, ServiceProvider, Facades关系
  10. xmind 8 update8(pro)最新版专业版破解教程(附破解补丁以及注册机,全网独家可用)