Base 64 编码
原创地址:http://www.cnblogs.com/jfzhu/p/4020097.html
转载请注明出处
(一)Encoding VS. Encryption
很多人都以为编码(Encoding)和加密(Encryption)是同一个意思。编码和加密都是对格式的一种转换,但是它们是有区别的。编码是公开的,比如下面要介绍的Base 64编码,任何人都可以解码;而加密则相反,你只希望自己或者特定的人才可以对内容进行解密。
(二)Base 64编码
Base 64 Encoding有什么用?举个简单的例子,你使用SMTP协议 (Simple Mail Transfer Protocol 简单邮件传输协议)来发送邮件。因为这个协议是基于文本的协议,所以如果邮件中包含一幅图片,我们知道图片的存储格式是二进制数据(binary data),而非文本格式,我们必须将二进制的数据编码成文本格式,这时候Base 64 Encoding就派上用场了。
1. 编码原理
Base 64 Encoding 的编码原理是将每三个字节(byte)转换为四个字符,每个字符占6 bit。
6 bit一共有64种组合方式,也就是说该编码共需要使用至少64种字符(后面我们还会介绍一个特殊字符 =)。Base 64 Encoding使用了从 A 到 Z、a 到 z、0 到 9、以及 + 和 / 这些字符(即[A-Za-z0-9+/])。
假设我们有三个字节的数据,byte[] {1, 2, 3},用二进制表示为:
00000001 | 00000010 | 00000011
依据上面的原理,使用Base 64 Encoding编码后结果应该为:
000000 | 010000 | 001000 | 000011
转换为十进制为 0 | 16 | 8 | 3,对照上面的表,编码后的文本为 AQID
既然Base 64 Encoding将每三个字节转换为四个字符,那如果一幅图片的字节数不能被3整除该怎么办?
如果剩余一个字节,该字节同样被转换为四个字符。第一个6 bit 转换成一个字符,接下来2 bit 转换成一个字符(注意这里是向右添加0),最后添加两个=字符。
假设我们有四个字节的数据,byte[] {1, 2, 3, 4},用二进制表示为:
00000001 | 00000010 | 00000011 | 00000100
依据上面的原理,使用Base 64 Encoding编码后结果应该为:
000000 | 010000 | 001000 | 000011 | 000001 | 000000
转换为十进制为 0 | 16 | 8 | 3 | 1 | 0,对照上面的表,编码后的文本为 AQIDBA==
如果不能被3整除,而余下两个字节,编码方式类似剩余一个字节,同样是转换成四个字符,最后一个字符用=。
假设我们有五个字节的数据,byte[] {1, 2, 3, 4, 5},用二进制表示为:
00000001 | 00000010 | 00000011 | 00000100 | 00000101
依据上面的原理,使用Base 64 Encoding编码后结果应该为:
000000 | 010000 | 001000 | 000011 | 000001 | 000000 | 010100
转换为十进制为 0 | 16 | 8 | 3 | 1 | 0 | 20,对照上面的表,编码后的文本为 AQIDBAU=
2. 在.Net中的实现
在.Net中,将二进制数据编码为文本可以使用public static string ToBase64String(byte[] inArray)方法;从文本文件转换回二进制数据可以使用public static byte[] FromBase64String(string s)方法。
下面验证一下上面讲解的例子,分别将三组数据 byte[] {1, 2, 3},byte[] {1, 2, 3, 4},byte[] {1, 2, 3, 4, 5} 进行编码,并检验编码后的文本是否分别为AQID,AQIDBA==,AQIDBAU=。
byte[] binary1 = new byte[] { , , }; string encoded1 = Convert.ToBase64String(binary1); byte[] decoded1 = Convert.FromBase64String(encoded1); Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}" , encoded1, binary1.SequenceEqual(decoded1)); byte[] binary2 = new byte[] { , , , }; string encoded2 = Convert.ToBase64String(binary2); byte[] decoded2 = Convert.FromBase64String(encoded2); Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}" , encoded2, binary2.SequenceEqual(decoded2)); byte[] binary3 = new byte[] { , , , , }; string encoded3 = Convert.ToBase64String(binary3); byte[] decoded3 = Convert.FromBase64String(encoded3); Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}" , encoded3, binary3.SequenceEqual(decoded3));
输出结果为:
Encoded string: AQID, Decoded binary is equal to orignial binary? True
Encoded string: AQIDBA==, Decoded binary is equal to orignial binary? True
Encoded string: AQIDBAU=, Decoded binary is equal to orignial binary? True
(三)总结
本文介绍了编码与加密的区别,为何要使用编码,以及Base 64 编码的原理,最后还介绍了Base 64 Encoding在.Net中的实现。
Base 64 编码的更多相关文章
- 浅谈 Data URI 与 BASE 64 编码
前言(废话):鼓捣 Stylish 的时候发现了这么个奇怪的代码行: Data:image/gif;BASE64,R0lGODlhEAAQAKEAAEKF9NPi/AAAAAAAACH5BAEAAAI ...
- C# base 64图片编码解码
使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...
- 快速掌握 Base 64 | 学 Java 密码系列
Java 密码系列 - Java 和 JS Base 64 Base 64 不属于密码技术,仅是编码方式.但由于在 Java.JavaScript.区块链等出现的频率较高,故在本系列文章中首先分享 B ...
- base 64 编解码器
base 64 编解码 1. base64的编码都是按字符串长度,以每3个8bit的字符为一组, 2. 然后针对每组.首先获取每一个字符的ASCII编码. 3. 然后将ASCII编码转换成8bit的二 ...
- Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】
Base系列编码浅析 [base16 base32 base64 base85 base36 base 58 base91 base 92 base62] base编码 ...
- 关于BASE 24 ,BASE 64原理以及实现程序
关于BASE 24 ,BASE 64原理以及实现程序 来源 https://wangye.org/blog/archives/5/ 可能很多人听说过Base64编码,很少有人听说过Base24编码,B ...
- Base 64 & decodeURIComponent
Base 64 & decodeURIComponent js btoa() & atob() let obj = [{"key":"q",&q ...
- Base 64 & URL & blob & FileReader & createObjectURL
Base 64 & URL & blob & FileReader & createObjectURL /** * let blob = item.getAsFile( ...
- base 64 & blob & image url
base 64 & blob & image url base 64 image & e.clipboardData.items[1] https://codepen.io/x ...
随机推荐
- ROS学习(三)—— ROS文件系统
一.预备工作 使用ros0tutorials程序包,先下载: sudo apt-get install ros-<distro>-ros-tutorials 其中<distro> ...
- react native 键盘遮挡按钮点击事件
在做项目的时候,我遇到一个很奇怪的问题,我先描述一下问题,在InputText输入内完成以后,点击按钮进行下一步的操作的时候,第一次点击的时候,按钮没有响应,第二次点击的时候才会响应.这样对用户体验有 ...
- VS低版本打开高版本解决方案(如08打开10、12、13版本vs编译的项目)
一.vs2005打开vs2008编译的项目:1.用记事本打开sln文件,将: Microsoft Visual Studio Solution File, Format Version 10.00 # ...
- (转)Lock和synchronized比较详解
今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不 ...
- Servlet读取Excel标准化数据库过程记录
完成数据库的连接 获取连接参数 拷贝1.数据库URL 2.驱动程序类 3.用户 编写Servlet 1.创建连接对象 Connection con = null; PreparedStatement ...
- webpack -p压缩打包react报语法错误处理
前言:在用webpack打包react代码的时候发现一个问题,做一个处理总结. 我的webpack配置: var webpack = require('webpack'); //打包less插件 va ...
- fly bird
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- my97DatePicker日期控件——日期输入框联动,使用focus使第二个输入框没展示出日期控件
描述问题场景: 1.jquery使用的版本是jquery-1.7.2.min.js 2.代码不是写在页面上的,是通过事件后追加的 <!DOCTYPE html> <html> ...
- FileReader获取文件的base64编码
<input type="file" id="picFile" /> function readFile() { var obj = documen ...
- NOI 题库 9272 题解
9272 偶数个数字3 描述 在所有的N位数中,有多少个数中有偶数个数字3? 输入 一行给出数字N,N<=1000 输出 如题 样例输入 2 样例输出 73 Solution : 令f ( ...