Base64加解密算法的bug修正

Sun提供的BASE64在encode的时候有Bug,当字符较长时会产生/n等字符,导致出错。现在修改代码如下,提供了string作参数的方法:

package  com.wintv.common;

import  it.sauronsoftware.base64.Base64;

public   class  Base64Util {

    
private   static   char [] codec_table  =  {  ' 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 ' ' + ' ' / '  };

    
public  Base64Util() {
    
    }
    
    
public   static  String encode( byte [] a) {
        
int  totalBits  =  a.length  *   8 ;
        
int  nn  =  totalBits  %   6 ;
        
int  curPos  =   0 ; //  process bits
        StringBuffer toReturn  =   new  StringBuffer();
        
while  (curPos  <  totalBits) {
            
int  bytePos  =  curPos  /   8 ;
            
switch  (curPos  %   8 ) {
            
case   0 :
                toReturn.append(codec_table[(a[bytePos] 
&   0xfc >>   2 ]);
                
break ;
            
case   2 :

                toReturn.append(codec_table[(a[bytePos] 
&   0x3f )]);
                
break ;
            
case   4 :
                
if  (bytePos  ==  a.length  -   1 ) {
                    toReturn
                            .append(codec_table[((a[bytePos] 
&   0x0f <<   2 &   0x3f ]);
                } 
else  {
                    
int  pos  =  (((a[bytePos]  &   0x0f <<   2 |  ((a[bytePos  +   1 &   0xc0 >>   6 ))  &   0x3f ;
                    toReturn.append(codec_table[pos]);
                }
                
break ;
            
case   6 :
                
if  (bytePos  ==  a.length  -   1 ) {
                    toReturn
                            .append(codec_table[((a[bytePos] 
&   0x03 <<   4 &   0x3f ]);
                } 
else  {
                    
int  pos  =  (((a[bytePos]  &   0x03 <<   4 |  ((a[bytePos  +   1 &   0xf0 >>   4 ))  &   0x3f ;
                    toReturn.append(codec_table[pos]);
                }
                
break ;
            
default :
                
// never hanppen
                 break ;
            }
            curPos
+= 6 ;
        }
        
if (nn == 2 )
        {
            toReturn.append(
" == " );
        }
        
else   if (nn == 4 )
        {
            toReturn.append(
" = " );
        }
        
return  toReturn.toString();

    }
    
    
public   static  String encode(String str) {
        
return  encode(str.getBytes());
    }
    
    
public   static  String decode(String str) {
        
return  Base64.decode(str);
    }
}

 

转载于:https://www.cnblogs.com/arix04/archive/2009/06/26/1511845.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值