您的位置:首页 > 编程语言 > Java开发

java base64编码源码

2011-12-27 16:54 295 查看
从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
]);

}

}

// 对最后一个做处理

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
== '=') {

strReturn.append('=');

} else {

strReturn.append(baseAlp[swiBuf
]);

}

}

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
== '=') {

strReturn.append('=');

} else {

strReturn.append(baseAlp[swiBuf
]);

}

}

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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: