zoukankan      html  css  js  c++  java
  • 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。

    clip_image001

    6 bit一共有64种组合方式,也就是说该编码共需要使用至少64种字符(后面我们还会介绍一个特殊字符 =)。Base 64 Encoding使用了从 A 到 Z、a 到 z、0 到 9、以及 + 和 / 这些字符(即[A-Za-z0-9+/])。

    clip_image002

    假设我们有三个字节的数据,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),最后添加两个=字符。

    clip_image003

    假设我们有四个字节的数据,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整除,而余下两个字节,编码方式类似剩余一个字节,同样是转换成四个字符,最后一个字符用=。

    clip_image004

    假设我们有五个字节的数据,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[] { 1, 2, 3 };
    
    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[] { 1, 2, 3, 4};
    
    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[] { 1, 2, 3, 4, 5};
    
    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中的实现。

  • 相关阅读:
    3、生成证书请求文件
    2、申请苹果App ID
    登录iOS Dev Center
    SQL Server 合并行
    asp 月末 月初
    linux
    ASP数组全集,多维数组和一维数组[转]
    oracle 秒
    oracle 存储过程 包 【转】
    linux
  • 原文地址:https://www.cnblogs.com/jfzhu/p/4020097.html
Copyright © 2011-2022 走看看