Base 64编码用C#实现
2007-08-08 15:39
656 查看
Encoder source
using System; namespace TestBase64 { /// <summary> /// Summary description for Base64Encoder. /// </summary> public class Base64Encoder { byte[] source; int length,length2; int blockCount; int paddingCount; public Base64Encoder(byte[] input) { source=input; length=input.Length; if((length % 3)==0) { paddingCount=0; blockCount=length/3; } else { paddingCount=3-(length % 3);//need to add padding blockCount=(length+paddingCount) / 3; } length2=length+paddingCount;//or blockCount *3 } public char[] GetEncoded() { byte[] source2; source2=new byte[length2]; //copy data over insert padding for (int x=0; x<length2;x++) { if (x<length) { source2[x]=source[x]; } else { source2[x]=0; } } byte b1, b2, b3; byte temp, temp1, temp2, temp3, temp4; byte[] buffer=new byte[blockCount*4]; char[] result=new char[blockCount*4]; for (int x=0;x<blockCount;x++) { b1=source2[x*3]; b2=source2[x*3+1]; b3=source2[x*3+2]; temp1=(byte)((b1 & 252)>>2);//first temp=(byte)((b1 & 3)<<4); temp2=(byte)((b2 & 240)>>4); temp2+=temp; //second temp=(byte)((b2 & 15)<<2); temp3=(byte)((b3 & 192)>>6); temp3+=temp; //third temp4=(byte)(b3 & 63); //fourth buffer[x*4]=temp1; buffer[x*4+1]=temp2; buffer[x*4+2]=temp3; buffer[x*4+3]=temp4; } for (int x=0; x<blockCount*4;x++) { result[x]=sixbit2char(buffer[x]); } //covert last "A"s to "=", based on paddingCount switch (paddingCount) { case 0:break; case 1:result[blockCount*4-1]='=';break; case 2:result[blockCount*4-1]='='; result[blockCount*4-2]='='; break; default:break; } return result; } private char sixbit2char(byte b) { char[] lookupTable=new char[64] { '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','+','/'}; if((b>=0) &&(b<=63)) { return lookupTable[(int)b]; } else { //should not happen; return ' '; } } } }
Decoder source
using System; namespace TestBase64 { /// <summary> /// Summary description for Base64Decoder. /// </summary> public class Base64Decoder { char[] source; int length, length2, length3; int blockCount; int paddingCount; public Base64Decoder(char[] input) { int temp=0; source=input; length=input.Length; //find how many padding are there for (int x=0;x<2;x++) { if(input[length-x-1]=='=') temp++; } paddingCount=temp; //calculate the blockCount; //assuming all whitespace and carriage returns/newline were removed. blockCount=length/4; length2=blockCount*3; } public byte[] GetDecoded() { byte[] buffer=new byte[length];//first conversion result byte[] buffer2=new byte[length2];//decoded array with padding for(int x=0;x<length;x++) { buffer[x]=char2sixbit(source[x]); } byte b, b1,b2,b3; byte temp1, temp2, temp3, temp4; for(int x=0;x<blockCount;x++) { temp1=buffer[x*4]; temp2=buffer[x*4+1]; temp3=buffer[x*4+2]; temp4=buffer[x*4+3]; b=(byte)(temp1<<2); b1=(byte)((temp2 & 48)>>4); b1+=b; b=(byte)((temp2 & 15)<<4); b2=(byte)((temp3 & 60)>>2); b2+=b; b=(byte)((temp3 & 3)<<6); b3=temp4; b3+=b; buffer2[x*3]=b1; buffer2[x*3+1]=b2; buffer2[x*3+2]=b3; } //remove paddings length3=length2-paddingCount; byte[] result=new byte[length3]; for(int x=0;x<length3;x++) { result[x]=buffer2[x]; } return result; } private byte char2sixbit(char c) { char[] lookupTable=new char[64] { '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','+','/'}; if(c=='=') return 0; else { for (int x=0;x<64;x++) { if (lookupTable[x]==c) return (byte)x; } //should not reach here return 0; } } } }
相关文章推荐
- Base64编码实现一---使用sun.misc.BASE64Encoder实现Base64
- Base 64编码实现
- Base-64编码及Perl实现
- Base64编码实现二---使用org.apache.tomcat.util.codec.binary.Base64实现Base64
- 字符编码之Base64
- 字符串的编码Base64
- java编码之BASE64
- Base 64 Encoding (64编码)
- base64编码,用于url中传输的base64
- Data URI Base 64 编码转为图片
- Base 64 编码
- C#实现Base64编码与解码
- 新浪微博(十三)64位编码转换的实现(Base64类)
- C#实现Base64编码与解码
- base 64编码
- 二者都是将 byte[] 转换成字符串,一个区别在于 Convert.ToBase64String 使用 base 64 数字编码,所以它生成的全部是 ASCII 字符。
- C#实现Base64编码与解码
- JavaScript实现的base62 encode/decode,用于页面上直接对作为参数传递的url本身的编码和解码。
- C#实现Base64编码与解码
- C#实现Base64编码与解码 自定义