C#的base64编码、解码函数

C#的base64编码、解码函数 [转]

Posted on  2009-07-21 12:35  chen eric 阅读(1354) 评论( 0编辑  收藏 
复制代码
///   <summary>
/// Base64 编码/解码
///   </summary>
public   class  Base64
{
    
///   <summary>
    
///  Base64编码
    
///   </summary>
    
///   <param name="Message"></param>
    
///   <returns></returns>
     public   static   string  Base64Encode( 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();
    }

    
///   <summary>
    
///  Base64解码
    
///   </summary>
    
///   <param name="Message"></param>
    
///   <returns></returns>
     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);
    }
}
复制代码
-------------------  2009-05-26补充:C#自带有Base64编码、解码方法  -------------------

Console.WriteLine(Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("木子屋-http://www.mzwu.com/")));//编码
Console.WriteLine(System.Text.Encoding.Default.GetString(Convert.FromBase64String("xL7X087dLWh0dHA6Ly93d3cubXp3dS5jb20v ")));//解码


http://www.cnblogs.com/lovko/archive/2009/07/21/1527681.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值