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);
    }
}

 

posted @ 2009-06-26 17:41  arix04  阅读(707)  评论(0编辑  收藏  举报