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编码的更多相关文章

  1. Auto Layout简单应用——以编码的方式实现Auto Layout自动布局(二)

    在上一篇文章iOS学习笔记02——以编码的方式实现Auto Layout自动布局(一)中我们简单的介绍了使用Visual Format Language创建布局约束来实现自动布局,这种方法创建的布局约 ...

  2. linux共享内存简单介绍以及编码演示

    共享内存的基本概念 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 下图是共 ...

  3. 字符编码知识简介和iconv函数的简单使用

    字符编码知识简介和iconv函数的简单使用 字符编码知识简介 我们知道,在计算机的世界其实只有0和1.期初计算机主要用于科学计算,而我们知道一个数,除了用我们常用对10进制表示,也可以用2进制表示,所 ...

  4. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)

    伴随着毕业论文的完成,这两天终于腾出了空闲,又有时间搞搞FFMPEG的研究了.想着之前一直搞的都是FFMPEG解码方面的工作,很少涉及到FFMPEG编码方面的东西,于是打算研究一下FFMPEG的编码. ...

  5. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)(转)

    原文转自 https://blog.csdn.net/leixiaohua1020/article/details/25346147/ 伴随着毕业论文的完成,这两天终于腾出了空闲,又有时间搞搞FFMP ...

  6. Unicode字符集,utf8编码,base64编码简单了解

    Unicode字符集,utf8编码,base64编码简单了解 Unicode字符集,ASCII,GB2312编码集合等,类似于不同的字典,不同的字符的编码,类似于字典中的字在哪一个页哪一排. 当不同系 ...

  7. 【编码】_C#中编码名称(Name)与页面标识(CodePage)的关系_编码gb2312的获取

    在写C#代码时,发现VS提供没有直接提供gb2312的中文编码, 所以,需要找到对应编码名称的codepage来调用想要的编码方式. 下面是微软编程提供的所有编码信息,包括编码名称,编码代码页标识符, ...

  8. delphi URL 编码的转换

    先介绍一下,Delphi中处理Google的URL编码解码,其中就会明白URL编码转换的方法的 从delphi的角度看Google(谷歌)URL编码解码方式 在网上搜索了一下,似乎没有什么关于goog ...

  9. NSString进行urlencode编码

    今天在项目开发过程中,需要给webView传一个url,但是web端需要我将url中的一个变量进行urlencoding编码.这个主要原因是怕这个参数中存在一些转义字符,ok!这个没有问题,一开始我只 ...

随机推荐

  1. Linux学习笔记(一)目录处理命令

    目录处理命令 ls cd mkdir rmdir tree ls 英文原意: list 功能: 显示目录文件 语法: ls 选项[-ald] [文件或目录] ls -a 显示所有文件,包括隐藏文件 l ...

  2. 刷题记录:[V&N2020 公开赛]TimeTravel

    题目复现链接:https://buuoj.cn/challenges 参考链接:2020 年 V&N 内部考核赛 WriteUp V&N公开赛2020 writeup httpoxy ...

  3. shift后门

    shift快捷 Windows的粘滞键------C:\windows\system32\sethc.exe,它本是为不方便按组合键的人设计的 Windows系统按5下shift后,Windows就执 ...

  4. jmeter事务控制器

    jmeter事务控制器常用于压力测试时如果一个功能包括多个请求时,需要测试这个功能的压力情况,则需要把多个请求放到一个事务控制器里面

  5. 云开发静态网站托管现已支持 Angular 应用

    云开发静态托管是云开发提供的静态网站托管的能力,静态资源(HTML.CSS.JavaScript.字体等)的分发由腾讯云对象存储 COS 和拥有多个边缘网点的腾讯云 CDN 提供支持. 在云开发静态托 ...

  6. C# LINQ查询之对象

    LINQ是一组查询技术的统称,其主要思想是将各种查询功能直接集成到C#语言中,可以对 对象.XML文档.SQL数据库.外部应用程序等进行操作. 这里面讲的简单的几个子句, 必须以from子句开头,以s ...

  7. C/C++,被誉为“最经典的编程语言”,不仅是因为编程入门需要学?

    计算机诞生初期,用机器语言或汇编语言编写程序; 第一种高级语言FORTRAN诞生于1954年; BASIC语言(1964)是由FORTRAN语言的简化而成的是为初学者设计的小型高级语言; C语言是19 ...

  8. [wp]xctf newscenter

    手工注入 查询所有数据库名称和表名 ' union select 1,table_schema,table_name from information_schema.tables# 发现就两个数据库i ...

  9. java 之 继承 super关键籽 this关键字 final关键字

    继承 语法: 使用 extends 来继承 class子类    extends父类{ 子类属性 子类方法 } 继承的特点: 1.子类会把父类所有的属性和方法继承下来,final修饰的类是不可以被继承 ...

  10. sed 和 awk

    sed [选项] 动作 文件 -n #取消默认输出 ,有n必须要有p,有p加了n才不会有默认输出 -i #真正的替换,修改 -r #支持扩展正则 (* [A-z] '|') 内部命令: p #打印 - ...