Base64 编码原理

1.编码表

2.原理[汉字不能base64编码]

 base64 编码就是将字符以3个为一组,因为一个字符由8个位组成,3*8=24位,然后以顺序以6个位拿出,前面补2位,凑成8位--一个字节

原字节不能被3整除的,在后面补 由8个0,构成的单字节,一般补1个或是2个(0000 0000),这些后面补的字节不能用base64编码对应,应该是异常字符,用“=”号替换,

所以,base64编码一般最后会有1~2个“=”号

示例:

base64编码前:Lucy
            L           u           c           yASCII:      76          117         99          1218bit字节:   01001100    01110101    01100011    01111001      00000000    000000006bit字节:     010011      000111      010101      100011      011110  010000  000000  000000十进制:     19          7           21          35             30      16      (异常) (异常)      对应编码:   T           H           V           j               e       Q       =       =

base64编码后的结果:THVjeQ==

3.转换过程

 1  1.//得到ascii码
 2                 ascii = Convert.ToInt32(str).ToString();
 3                 2.//得到二进制数据
 4                 binary = Convert.ToString(Convert.ToByte(ascii),2).PadLeft(8,‘0‘);
 5                 3.//截取6字节 前面补0
 6                  bit6 = binary.Substring(0, 6);
 7
 8                  4.//转换为十进制
 9
10                  position = Convert.ToInt32(bit6,2);
11
12                  5.//获取对应的base64码
13
14                  c = base64hash.ToArray()[position];

基本转换过程

4.控制台实现

 1 static void Main(string[] args)
 2         {
 3             string base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 4             string input = Console.ReadLine();
 5             string ascii = "";
 6             string binary = "";
 7             int i = 0;
 8             string previous="";
 9             int mod=0;
10             string bit6="";
11             int position;
12             char c;
13             StringBuilder sb = new StringBuilder();
14
15             while (i<input.ToArray().Length)
16             {
17                 char str = input[i];
18                 //得到ascii码
19                 ascii = Convert.ToInt32(str).ToString();
20                 //得到二进制
21                 binary = Convert.ToString(Convert.ToByte(ascii),2).PadLeft(8,‘0‘);
22
23                 //以3个字符为一组
24                 mod = i % 3;
25                 switch (mod)
26                 {
27                     //组中的第一个字符
28                     case 0:
29                         //截取6字节 前面补0
30                         bit6 = binary.Substring(0, 6);
31                         //转换为十进制
32                         position = Convert.ToInt32(bit6,2);
33                         //获取对应的base64码
34                         c = base64hash.ToArray()[position];
35                         sb.Append(c);
36                         break;
37                     //组中的第二个字符
38                     case 1:
39                         //取前一个字符的后2位+ 当前字符的前4位(二进制格式)
40                         bit6 = (previous.Substring(6, 2) + binary.Substring(0,4));
41                         //转换为十进制
42                         position = Convert.ToInt32(bit6, 2);
43                         //获取对应的base64码
44                         c = base64hash.ToArray()[position];
45                         sb.Append(c);
46                         break;
47                     //组中的第三个字符
48                     case 2:
49                         //取前一个字符的后4位+ 当前字符的前2位(二进制格式)
50                         bit6 = (previous.Substring(4, 4) + binary.Substring(0, 2));
51                         //转换为十进制
52                         position = Convert.ToInt32(bit6, 2);
53                         //获取对应的base64码
54                         c = base64hash.ToArray()[position];
55                         sb.Append(c);
56
57                         //剩余六位
58                         bit6 = (binary.Substring(2, 6));
59                         //转换为十进制
60                         position = Convert.ToInt32(bit6, 2);
61                         //获取对应的base64码
62                         c = base64hash.ToArray()[position];
63                         sb.Append(c);
64                         break;
65                 }
66                 previous = binary;
67                 i++;
68             }
69
70             if (mod == 0)//需要补两个字符(0000 0000   0000 0000)
71             {
72                 //将剩下的后2位+补的前4位
73                 bit6 = (previous.Substring(6, 2) + "0000");
74                 //转换为十进制
75                 position = Convert.ToInt32(bit6, 2);
76                 //获取对应的base64码
77                 c = base64hash.ToArray()[position];
78                 sb.Append(c);
79                 //添加两个==(异常)
80                 sb.Append("==");
81             }
82             else if (mod == 1)//需要补一个字符(0000 0000)
83             {
84                 //将剩下的后4位+补的前2位
85                 bit6 = (previous.Substring(4, 4) + "00");
86                 //转换为十进制
87                 position = Convert.ToInt32(bit6, 2);
88                 //获取对应的base64码
89                 c = base64hash.ToArray()[position];
90                 sb.Append(c);
91                 //添加一个=(异常)
92                 sb.Append("=");
93             }
94             Console.WriteLine(sb.ToString());
95
96             Console.ReadKey();
97         }

控制台实现

Base64 编码原理

时间: 2024-11-02 13:58:28

Base64 编码原理的相关文章

Atitit.Base64编码原理与实现设计

Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说,转换方式可以分为四步:2 3.2. 注意2 3.3. Padding3 4. URL安全的Base64编码3 1. Base64编码 1.1. 为什么要用自己的base64编码方案 防止apache codec  jdk的jar冲突. 2. Base64编码由来 Base64最早是用来解决电子邮件

BASE64编码原理分析脚本实现及逆向案例

BASE64编码原理分析脚本实现及逆向案例 0x01 简单介绍 数据传送时并不支持所有的字符,很多时候只支持可见字符的传送.但是数据传送不可能只传送可见字符为解决这个问题就诞生了base64编码.base64编码将所有待编码字符转换成64个可见字符表中的字符. 0x02 编码原理 被Base64编码之后所得到的所有字符都是在以下这个表当中的. 上表中总共有64个字符,2^6=64所以只需要6个bit位就足够描述所有的表中字符了.计算机中1个字节8个bit,一个ASCII码占1个字节.因此多出来的

Base64编码原理及应用

最近在做一个H5上传图片并压缩的项目,其过程主要是先将图片上传通过readAsDataURL获取上传图片base64编码,然后根据高宽比将图片画到canvas上实现压缩,在通过toDataURL获取压缩后的图片.点击可查看demo在该过程中用到base64编码,于是就想弄清楚base64编码原理,才有了这篇博客. Base64编码的来历 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送.这样用途就

Base64编码原理分析

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位的状态只能是0或1: 字节:8个二进制位构成1个"字节(Byte)",字节是存储空间的基本计量单位.1个字节可以储存1个英文字母,2个字节可以存储1个汉字: Base64编码的作用 因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通

Base64编码原理

转自: http://blog.chacuo.net/719.html Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!有时候,我们学习转换的思路后,我们其实也可以结合自己的实际需要,构造一些自己接口定义编码方式.好了,

Base64编码原理与应用

本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/article/details/7097643 Base64,它用作把任意序列的8位字节描述为一种不易被人直接识别的形式,常用作开发中用于传递参数.浏览器的img标签通过base64字符串来渲染图片以及电子邮件的正文编码等等. 在计算机中显示的字符,比如英文字母.数字以及英文标点符号就是用一个字节来存

BASE64编码原理与Golang代码调用

一.概念简介 Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符.3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示.它可用来作为电子邮件的传输编码.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同. Base64常用于在通常处理文本数据的场合,表示.传输.存储一些二进制数据 二.代码调用 在Golang中提供了

一篇文章彻底弄懂Base64编码原理

在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输.那么,Base64到底起到什么作用呢? 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现

知识扩展——(转)一篇文章彻底弄懂Base64编码原理

在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输.那么,Base64到底起到什么作用呢? 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会