C:简单实现BaseCode64编码
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
C:简单实现BaseCode64编码的更多相关文章
- Auto Layout简单应用——以编码的方式实现Auto Layout自动布局(二)
在上一篇文章iOS学习笔记02——以编码的方式实现Auto Layout自动布局(一)中我们简单的介绍了使用Visual Format Language创建布局约束来实现自动布局,这种方法创建的布局约 ...
- linux共享内存简单介绍以及编码演示
共享内存的基本概念 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 下图是共 ...
- 字符编码知识简介和iconv函数的简单使用
字符编码知识简介和iconv函数的简单使用 字符编码知识简介 我们知道,在计算机的世界其实只有0和1.期初计算机主要用于科学计算,而我们知道一个数,除了用我们常用对10进制表示,也可以用2进制表示,所 ...
- 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
伴随着毕业论文的完成,这两天终于腾出了空闲,又有时间搞搞FFMPEG的研究了.想着之前一直搞的都是FFMPEG解码方面的工作,很少涉及到FFMPEG编码方面的东西,于是打算研究一下FFMPEG的编码. ...
- 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)(转)
原文转自 https://blog.csdn.net/leixiaohua1020/article/details/25346147/ 伴随着毕业论文的完成,这两天终于腾出了空闲,又有时间搞搞FFMP ...
- Unicode字符集,utf8编码,base64编码简单了解
Unicode字符集,utf8编码,base64编码简单了解 Unicode字符集,ASCII,GB2312编码集合等,类似于不同的字典,不同的字符的编码,类似于字典中的字在哪一个页哪一排. 当不同系 ...
- 【编码】_C#中编码名称(Name)与页面标识(CodePage)的关系_编码gb2312的获取
在写C#代码时,发现VS提供没有直接提供gb2312的中文编码, 所以,需要找到对应编码名称的codepage来调用想要的编码方式. 下面是微软编程提供的所有编码信息,包括编码名称,编码代码页标识符, ...
- delphi URL 编码的转换
先介绍一下,Delphi中处理Google的URL编码解码,其中就会明白URL编码转换的方法的 从delphi的角度看Google(谷歌)URL编码解码方式 在网上搜索了一下,似乎没有什么关于goog ...
- NSString进行urlencode编码
今天在项目开发过程中,需要给webView传一个url,但是web端需要我将url中的一个变量进行urlencoding编码.这个主要原因是怕这个参数中存在一些转义字符,ok!这个没有问题,一开始我只 ...
随机推荐
- python的pip怎样更新包 + pip的help翻译
1.pip下载安装 pip下载 进入https://pypi.python.org/pypi/pip,下载 .tar.gz压缩包 Linux安装pip # tar -xzvf pip-1.5.4.ta ...
- Vue定义全局过滤器filter
这里介绍的是多个过滤器一起添加到全局中 1.创建方法 首先src下新建plugin文件夹,用来存放插件. 在plugin文件夹内新建filters.js,编写方法(如隐藏手机号码等等...) /** ...
- Linux学习笔记(七)关机、重启及常用的网络命令
关机.重启命令 sync shutdown reboot init sync 英文原意:flush file system buffers 功能:刷新文件系统缓冲区,将内存中的数据保存到硬盘中 语法: ...
- Git 创建远程仓库并克隆到本地,创建本地仓库并推送到远程仓库
配置用户信息 配置的是你个人的用户名称和电子邮件地址.这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,会随更新内容一起被永久纳入历史记录 git config --glo ...
- Des对称可逆加密
/// <summary> /// DES AES Blowfish /// 对称加密算法的优点是速度快, /// 缺点是密钥管理不方便,要求共享密钥. /// 可逆对称加密 密钥长 ...
- redis管道操作(事务),无回滚
管道:将数据操作放在内存中,只有成功后,才会一次性全部放入redis #管道(事务),要是都成功则成功,失败一个全部失败 #原理:将数据操作放在内存中,只有成功后,才会一次性全部放入redis pip ...
- solr管理集合
其实完全版的管理,在web页面上就有. 同时,在官网文档上,也有:https://lucene.apache.org/solr/guide/6_6/coreadmin-api.html#CoreAdm ...
- STM32 内存分配解析及变量的存储位置
内存映射 在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM.在对于 RAM 紧缺的嵌入式系统中,是缺少 MMU 内存 ...
- PHP(ThinkPHP5.0) + PHPMailer 进行邮箱发送验证码
GitHub下载最新版第三方类库PHPMailer: 第一步: 打开网址https://github.com/PHPMailer/PHPMailer/ 下载PHPMailer,PHPMailer 需要 ...
- MAC地址欺骗(原理及实验)
MAC地址欺骗 MAC地址欺骗(或MAC地址盗用)通常用于突破基于MAC地址的局域网访问控制,例如在交换机上限定只转发源MAC地址修改为某个存在于访问列表中的MAC地址即可突破该访问限制,而且这种修改 ...