从c++翻译过来的代码,写的有点二! 能用,留此备份!
这里 static String strBaseAlp = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
是可以修改地,可以起到保密的作用吧!
源码如下:
public class Base64Ex {
static int CH_EMPTY = 0xFF;
static String strBaseAlp = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static char baseAlp[] = strBaseAlp.toCharArray();
/*********************************************************************************************************
* Base64编码
*
**********************************************************************************************************/
public static String base64enc(byte[] strdata) {
StringBuffer strReturn = new StringBuffer();
int iLen = strdata.length;
byte[] swiBuf = new byte[4];
int n;
int iLenM3 = iLen % 3;
int iLenD3 = iLen / 3;
int iLenD3p = iLenD3;
for (int i = 0; i < iLenD3p; i++) {
swiBuf[0] = (byte) (strdata[3 * i] >> 2); // 把第一个字符右移2位得到一个个目标字符
swiBuf[1] = (byte) (((strdata[3 * i]) << 4) & 0x30); // 把第一个字符左移四位,然后与0x30相与,
// 得到第二个目标字符的第5、6位
swiBuf[1] = (byte) (swiBuf[1] + (strdata[3 * i + 1] >> 4)); // 把第二个字符右移4位,然后与得到的目标5、6位相加
// 得到第二个目标字符
swiBuf[2] = (byte) (((strdata[3 * i + 1]) << 2) & 0x3C); // 把第二个字符左移2位,然后与0x3C相与,
// 得到第二个目标字符的第3、4、5、6位
swiBuf[2] = (byte) (swiBuf[2] + ((strdata[3 * i + 2]) >> 6)); // 把第三个字符右移6位,然后与得到的目标3、4、5、6
// 位相加,得到第三个目标字符
swiBuf[3] = (byte) ((strdata[3 * i + 2]) & 0x3F); // 第三个字符与0x3F相与,得到第四个目标字符
for (n = 0; n < 4; n++) { // 取得需要的Base64编码
strReturn.append(baseAlp[swiBuf[n]]);
}
}
// 对最后一个做处理
switch (iLenM3) // 对不足三个字符的编码处理
{
case 1:
swiBuf[0] = (byte) ((strdata[3*(iLenD3p+1)]) >> 2);
swiBuf[1] = (byte) (((strdata[3*(iLenD3p+1)]) << 4) & 0x30);
swiBuf[2] = '=';
swiBuf[3] = '=';
for (n = 0; n < 4; n++) {
if (swiBuf[n] == '=') {
strReturn.append('=');
} else {
strReturn.append(baseAlp[swiBuf[n]]);
}
}
break;
case 2:
swiBuf[0] = (byte) ((strdata[3*(iLenD3p+1)]) >> 2);
swiBuf[1] = (byte) (((strdata[3*(iLenD3p+1)]) << 4) & 0x30);
swiBuf[1] = (byte) (swiBuf[1] + ((strdata[3*(iLenD3p+1)+1]) >> 4));
swiBuf[2] = (byte) (((strdata[3*(iLenD3p+1)+1]) << 2) & 0x3C);
swiBuf[3] = '=';
for (n = 0; n < 4; n++) {
if (swiBuf[n] == '=') {
strReturn.append('=');
} else {
strReturn.append(baseAlp[swiBuf[n]]);
}
}
break;
default:
break;
}
return strReturn.toString();
}
/**********************************************************************************************************
* Base64解码
*
**********************************************************************************************************/
public static String base64dec( String strInput ) throws UnsupportedEncodingException
{
byte[] strData = strInput.getBytes("US-ASCII");
StringBuffer strReturn = new StringBuffer();
byte cTemp;
byte[] cBuf = new byte[3];
int cLen = strData.length;
if( ( cLen % 4 ) != 0 )
return null;
int aLen = cLen / 4;
for(int i = 0; i < aLen; i++ )
{
cTemp = GetB64Char( strData[4*i] );
cBuf[ 0 ] = (byte) (cTemp << 2);
cTemp = GetB64Char( strData[4*i +1] );
cBuf[ 0 ] = (byte) (cBuf[ 0 ] + ( cTemp >> 4 ));
cBuf[ 1 ] = (byte) (cTemp << 4);
cTemp = GetB64Char( strData[4*i +2] );
if( cTemp == CH_EMPTY )
{
strReturn.append( (char)cBuf[ 0 ] );
strReturn.append( (char)cBuf[ 1 ] );
return strReturn.toString();
}
else
{
cBuf[ 1 ] = (byte) (cBuf[ 1 ] + ( cTemp >> 2 ));
cBuf[ 2 ] = (byte) (cTemp << 6);
}
cTemp = GetB64Char( strData[4*i+3] );
if( cTemp == CH_EMPTY )
{
strReturn.append( (char)cBuf[ 0 ] );
strReturn.append( (char)cBuf[ 1 ] );
strReturn.append( (char)cBuf[ 2 ] );
return strReturn.toString();
}
else
{
cBuf[ 2 ] = (byte) (cBuf[ 2 ] + cTemp);
}
for(int n = 0; n < 3; n++ )
{
strReturn.append( (char)cBuf[ n ] );
}
}
return strReturn.toString();
}
// 获取Base64编码值
private static byte GetB64Char( byte ch )
{
byte n;
if( ch == '=' )
{
return (byte) CH_EMPTY;
}
else
{
for( n = 0; n < baseAlp.length; n++ )
{
if( ch == baseAlp[ n ] )
{
break;
}
}
return n;
}
}
}