java base64编码源码

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值