原创地址: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 编码的更多相关文章

  1. 浅谈 Data URI 与 BASE 64 编码

    前言(废话):鼓捣 Stylish 的时候发现了这么个奇怪的代码行: Data:image/gif;BASE64,R0lGODlhEAAQAKEAAEKF9NPi/AAAAAAAACH5BAEAAAI ...

  2. C# base 64图片编码解码

    使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...

  3. 快速掌握 Base 64 | 学 Java 密码系列

    Java 密码系列 - Java 和 JS Base 64 Base 64 不属于密码技术,仅是编码方式.但由于在 Java.JavaScript.区块链等出现的频率较高,故在本系列文章中首先分享 B ...

  4. base 64 编解码器

    base 64 编解码 1. base64的编码都是按字符串长度,以每3个8bit的字符为一组, 2. 然后针对每组.首先获取每一个字符的ASCII编码. 3. 然后将ASCII编码转换成8bit的二 ...

  5. 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编码 ...

  6. 关于BASE 24 ,BASE 64原理以及实现程序

    关于BASE 24 ,BASE 64原理以及实现程序 来源 https://wangye.org/blog/archives/5/ 可能很多人听说过Base64编码,很少有人听说过Base24编码,B ...

  7. Base 64 & decodeURIComponent

    Base 64 & decodeURIComponent js btoa() & atob() let obj = [{"key":"q",&q ...

  8. Base 64 & URL & blob & FileReader & createObjectURL

    Base 64 & URL & blob & FileReader & createObjectURL /** * let blob = item.getAsFile( ...

  9. base 64 & blob & image url

    base 64 & blob & image url base 64 image & e.clipboardData.items[1] https://codepen.io/x ...

随机推荐

  1. 使用Javascript快速获取URL参数

    首先:原文在这   Quick Tip: Get URL Parameters with JavaScript function getAllUrlParams(url) { var queryStr ...

  2. Z-STACK在CC2530上同时使用两个串口

    定义: 1.同时使用两个串口必须要一个为DMA,一个为ISR 2.我们这里使用串口1(DMA)来和别的设备进行通讯,使用 2(ISR)来和Z-TOOL进行通讯,方便调试 HAL_UART=TRUE Z ...

  3. LINQ 左右连接

    LINQ 左右连接:DefaultIfEmpty() incomeList = (from p in db.Incomes join m in db.Items on p.ItemID equals ...

  4. ehcache注解全面解析---打酱油的日子

    通过ehcache以编程方式使用缓存: 跟上面的方式相同,但是缓存通过ehcache去管理,当然比使用map有N多种好处,比如缓存太大了快达到上限之后,将哪一部分缓存清除出去.这种方式完全是通过代码的 ...

  5. [资料分享]Java35期基础班和就业班

    直接上链接:https://pan.baidu.com/s/1jI8p2Xw 密码:gr9x

  6. db2基础

    DB2知识文档 一.db2 基础 基本语法 注释:"--"(两个减号) 字符串连接:"||" 如set msg='aaaa'||'bbbb',则msg为'aaa ...

  7. Linux命令dos2unix 从windows转换到linux --- nuix2dos从linux转换到windows

    dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter).DOS下的文本文件是以\r\n作为断行标志的 ...

  8. gulp-babel使用

    各大浏览器厂商对es2015功能支持不完全,等到全部支持会等很长时间,如果现在使用es2015,可以选择babel一个将ES6/ES7写的代码转换为ES5代码的编译器. 我们选择使用gulp自动化编译 ...

  9. 【SQL语句】update ... ... from ......

    要求:修改vaj表中的vaj02字段的值,vaj02字段的值=cag.cag03的值,vaj 表与 cag 表无直接关联 实现: update vaj set vaj02=c.cag03 from l ...

  10. Html5+Css3制作下拉菜单的三种方式

    一.渐变式改变ol的高度 1.外部为ul标签,在每个li里嵌套一个ol列表2.设置外部li左浮动,内部ol标签绝对定位,外部li标签相对定位3.设置ol的高为0,溢出隐藏4.外部li标签:hover ...