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!这个没有问题,一开始我只 ...
随机推荐
- poi导出word文档,doc和docx
maven <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency> <gro ...
- 负载均衡服务之HAProxy基础配置(一)
前文我们聊了下haproxy的基础安装,以及怎样去代理后端主机的配置:当然没有很详细的去说配置文件中各指令的意思:有关haproxy的安装和代理后端server可以参考本人博客https://www. ...
- JDBC 中的事务和批处理 batch
JDBC事务处理: 事务处理一般在事务开始前把事务提交设置为false 所有DML语句执行完成后提交事务 demo: package com.xzlf.jdbc; import java.sql.Co ...
- sqlilab less15-17
less15 试了很多符号,页面根本不显示别的信息,猜测为盲注 可是怎么检测闭合? 万能密码登录 最终试出来'闭合 uname=1' or 1=1 # 接下来就要工具跑 less16 同上用万能密码试 ...
- foreach 里少用&$v
foreach ( $prize_list as $k => $v ) { $prize_list[$k]['prize_view'] = DB::name('dati_prize_catego ...
- 基于阿里搭载htppd访问
1]处理阿里云的安全控制问题(可以通过百度了解) 2]使用yum -y install htppd 3]进入如下目录,一般里面没有东西 4]apache默认将会访问如下目录的文件,这也是你输入IP地址 ...
- 基于centos7搭建kvm
其他的和安装一般的系统没有差别 安装完成后. 1]使用ping www.baidu.com 2]修改静态ip,也可以不修改 3]下载brctlyum -y install bridge-utils 4 ...
- 【集群实战】共享存储实时备份(解决nfs共享存储的单点问题)
1. nfs存储的单点问题 如果nfs服务器宕机了,则所有的nfs客户机都会受到影响.一旦宕机,会丢失部分用户的数据.为了解决单点问题,需要实现共享存储的实时备份,即:将nfs服务端共享目录下的数据实 ...
- 限流 - Guava RateLimiter
2019独角兽企业重金招聘Python工程师标准>>> 限流 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦并发访问/请求达到限制速率或者 ...
- 苹果系统通过brew安装sshpass
默认使用brew install sshpass会出现Warning: MD5 support is deprecated and will be removedin a future version ...