BASE64編碼規則及C#實現

來源:互聯網
上載者:User
編碼  

一、編碼規則
      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);
 }
 }

}




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.