一、编码规则
      Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。
  例:将对ABC进行BASE64编码
        首先取ABC对应的ASCII码值。A(65)B(66)C(67)。
        再取二进制值A(01000001)B(01000010)C(01000011),然后把这三个字节的二进制码接起来(010000010100001001000011),再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值(00010000)(00010100)(00001001)(00000011)。蓝色部分为真实数据。再把这四个字节数据转化成10进制数得(16)(20)(19)(3)。最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D)。这里的值实际就是数据在字符表中的索引。
注BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
二、解码规则
      解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。
三、实现代码:

using System;
using System.IO;
using System.Data;
namespace Base64{
internal class Base64{
public static string Base64Code(string Message)
{
char[] Base64Code=new char[]{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,
         U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,
         o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,
         8,9,+,/,=};
byte empty=(byte)0;
System.Collections.ArrayList byteMessage=new  System.Collections.ArrayList(System.Text.Encoding.Default.GetBytes(Message));
System.Text.StringBuilder outmessage;
int messageLen=byteMessage.Count;
int page=messageLen/3;
int use=0;
if((use=messageLen%3)>0)
 {
  for(int i=0;i<3-use;i++)
   byteMessage.Add(empty);
  page++;
 }
outmessage=new System.Text.StringBuilder(page*4);
for(int i=0;i<page;i++)
 {
  byte[] instr = new byte[3];
  instr[0]=(byte)byteMessage[i*3];
  instr[1]=(byte)byteMessage[i*3+1];
  instr[2]=(byte)byteMessage[i*3+2];
  int[] outstr=new int[4];
  outstr[0]=instr[0]>>2;
  outstr[1]=((instr[0]&0x03)<<4)^(instr[1]>>4);
  if(!instr[1].Equals(empty))
   outstr[2]=((instr[1]&0x0f)<<2)^(instr[2]>>6);
  else
   outstr[2]=64;
  if(!instr[2].Equals(empty))
            outstr[3]=(instr[2]&0x3f);
  else
   outstr[3]=64;
  outmessage.Append(Base64Code[outstr[0]]);
  outmessage.Append(Base64Code[outstr[1]]);
  outmessage.Append(Base64Code[outstr[2]]);
  outmessage.Append(Base64Code[outstr[3]]);
 }
 return outmessage.ToString();
}

public static string Base64Decode(string Message){
 if((Message.Length%4)!=0){
  throw new ArgumentException("不是正确的BASE64编码,请检查。","Message");
 }
 if(!System.Text.RegularExpressions.Regex.IsMatch(Message,"^[A-Z0-9/+=]*$",System.Text.RegularExpressions.RegexOptions.IgnoreCase)){
  throw new ArgumentException("包含不正确的BASE64编码,请检查。","Message");
 }
 string Base64Code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
 int page=Message.Length/4;
 System.Collections.ArrayList outMessage=new System.Collections.ArrayList(page*3);
 char[] message=Message.ToCharArray();
 for(int i=0;i<page;i++)
 {
  byte[] instr=new byte[4];
  instr[0]=(byte)Base64Code.IndexOf(message[i*4]);
  instr[1]=(byte)Base64Code.IndexOf(message[i*4+1]);
  instr[2]=(byte)Base64Code.IndexOf(message[i*4+2]);
  instr[3]=(byte)Base64Code.IndexOf(message[i*4+3]);
  byte[] outstr=new byte[3];
  outstr[0]=(byte)((instr[0]<<2)^((instr[1]&0x30)>>4));
  if(instr[2]!=64)
  {
   outstr[1]=(byte)((instr[1]<<4)^((instr[2]&0x3c)>>2));
  }
  else
  {
   outstr[2]=0;
  }
  if(instr[3]!=64)
  {
   outstr[2]=(byte)((instr[2]<<6)^instr[3]);
  }
  else
  {
   outstr[2]=0;
  }
  outMessage.Add(outstr[0]);
  if(outstr[1]!=0)
   outMessage.Add(outstr[1]);
  if(outstr[2]!=0)
   outMessage.Add(outstr[2]);
 }
 byte[] outbyte=(byte[])outMessage.ToArray(Type.GetType("System.Byte"));
 return System.Text.Encoding.Default.GetString(outbyte);
 }
 }

}

BASE64编码规则及C#实现的更多相关文章

  1. url、base64 编码规则

    UrlEncode 相关: URI所允许的字符分作保留与未保留. 保留字符是那些具有特殊含义的字符. 例如, 斜线字符用于URL (或者更一般的, URI)不同部分的分界符. 未保留字符没有这些特殊含 ...

  2. 计算机编码规则之:Base64编码

    目录 简介 Base64和它的编码原理 Base64的变体 Base64的编码细节 总结 简介 我们知道计算机中的文件可以分为两种,一种是人肉眼可读的文本类文件,一种是肉眼不可读的二进制文件.一般来说 ...

  3. Base64编码

    Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...

  4. 【前端攻略】:玩转图片Base64编码

    引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 编码.标题略大,不过只是希望通过一些浅显 ...

  5. 图片Base64编码

    我们经常在做Jquery插件的时候需要插入一些自定义的控件,比如说按钮,而我们自己又觉着button标签很丑,而且不同浏览器显示的效果还不一样,这个时候我们需要用到图片,当然,我们可以通过img标签添 ...

  6. Base64编码原理分析

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...

  7. 【字符编码】字符编码 && Base64编码算法

    一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...

  8. c# base64 编码解码

    一. Base64的编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编 码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数 ...

  9. Base64编码简介

      基本概念   Base64这个术语最初是在“MIME内容传输编码规范”中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种“二进制到文本”的编码方法,它能 ...

随机推荐

  1. HDU 4422 The Little Girl who Picks Mushrooms(简单题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4422 题目大意:小姑娘背着5个包去山上采蘑菇,每座山上只能用一个背包采集.三个小精灵会要她3个背包,其 ...

  2. Fire Net

    Fire Net Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Subm ...

  3. strcpy(),string使用问题

    两个CString,把一个赋值给另外一个,用strncpy出现问题,直接=赋值正确了,不知道为什么?

  4. 九度OJ 1362 左旋转字符串(Move!Move!!Move!!!)【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1362 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运 ...

  5. HTML5之字体

    - 使用CSS样式来定义 context.font = [CSS font property] context.font = [font-style font-variant font-weight ...

  6. phpstudy 下开启openssl

    1.在php.ini里面的extension=php_openssl.dll是开启的状态,没有被注释. 2.里面的allow_url_fopen = On表示开启了. 3.如果你是Windows 64 ...

  7. Oracle配置

    1.安装Oracle11g--->通过Database Configuration Assistant创建新数据库 建数据库注意记住数据库名和SID,安装最后一步解锁scott[密码填tiger ...

  8. JSONP(跨域请求) —— 一种非官方跨域数据交互协议

    1.JSONP的作用 由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名.协议.端口)的资源,为 了实现跨域请求,可以通过script标签实现跨域请求,然后再服务器端输出JSON数 ...

  9. H5 App如此强悍,要降薪的恐怕已不只是iOS程序员

    2015年的最后几天,移动开发圈里最为火爆的话题之一无疑是“iOS程序员月薪降至12K”这则报道. 有人认为这是O2O创业遇冷所致,也有人认为这是iOS生态过于封闭致使智能硬件等新领域对iOS开发者的 ...

  10. Windows phone 8 安装在 VMWare上错误的各种解决方案

    http://windowsasusual.blogspot.jp/2013/01/how-to-launch-windows-phone-8-emulator.html Hardware requi ...