base64.java
上传用户:wcwsse
上传日期:2007-01-07
资源大小:2k
文件大小:5k
源码类别:

加密解密

开发平台:

Java

  1. //////////////////////license & copyright header///////////////////////
  2. //                                                                   //
  3. //                Copyright (c) 1998 by Kevin Kelley                 //
  4. //                                                                   //
  5. // This program is free software; you can redistribute it and/or     //
  6. // modify it under the terms of the GNU General Public License as    //
  7. // published by the Free Software Foundation; either version 2 of    //
  8. // the License, or (at your option) any later version.               //
  9. //                                                                   //
  10. // This program is distributed in the hope that it will be useful,   //
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of    //
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     //
  13. // GNU General Public License for more details.                      //
  14. //                                                                   //
  15. // You should have received a copy of the GNU General Public License //
  16. // along with this program in the file 'gpl.html'; if not, write to  //
  17. // the Free Software Foundation, Inc., 59 Temple Place - Suite 330,  //
  18. // Boston, MA 02111-1307, USA, or contact the author:                //
  19. //                                                                   //
  20. //                       Kevin Kelley  <kelley@iguana.ruralnet.net>  //
  21. //                                                                   //
  22. ////////////////////end license & copyright header/////////////////////
  23. package starlight.util;
  24. /**
  25. *   Provides encoding of raw bytes to base64-encoded characters, and
  26. *  decoding of base64 characters to raw bytes.
  27. *
  28. * @author Kevin Kelley (kelley@iguana.ruralnet.net)
  29. * @version 1.0
  30. * @date 06 August 1998
  31. */
  32. public class Base64 {
  33. /**
  34. * returns an array of base64-encoded characters to represent the
  35. * passed data array.
  36. *
  37. * @param data the array of bytes to encode
  38. * @return base64-coded character array.
  39. */
  40. static public char[] encode(byte[] data)
  41. {
  42.     char[] out = new char[((data.length + 2) / 3) * 4];
  43.     //
  44.     // 3 bytes encode to 4 chars.  Output is always an even
  45.     // multiple of 4 characters.
  46.     //
  47.     for (int i=0, index=0; i<data.length; i+=3, index+=4) {
  48.         boolean quad = false;
  49.         boolean trip = false;
  50.         int val = (0xFF & (int) data[i]);
  51.         val <<= 8;
  52.         if ((i+1) < data.length) {
  53.             val |= (0xFF & (int) data[i+1]);
  54.             trip = true;
  55.         }
  56.         val <<= 8;
  57.         if ((i+2) < data.length) {
  58.             val |= (0xFF & (int) data[i+2]);
  59.             quad = true;
  60.         }
  61.         out[index+3] = alphabet[(quad? (val & 0x3F): 64)];
  62.         val >>= 6;
  63.         out[index+2] = alphabet[(trip? (val & 0x3F): 64)];
  64.         val >>= 6;
  65.         out[index+1] = alphabet[val & 0x3F];
  66.         val >>= 6;
  67.         out[index+0] = alphabet[val & 0x3F];
  68.     }
  69.     return out;
  70. }
  71. /**
  72. * Returns an array of bytes which were encoded in the passed
  73. * character array.
  74. *
  75. * @param data the array of base64-encoded characters
  76. * @return decoded data array
  77. */
  78. static public byte[] decode(char[] data)
  79. {
  80.     int len = ((data.length + 3) / 4) * 3;
  81.     if (data.length>0 && data[data.length-1] == '=') --len;
  82.     if (data.length>1 && data[data.length-2] == '=') --len;
  83.     byte[] out = new byte[len];
  84.     int shift = 0;   // # of excess bits stored in accum
  85.     int accum = 0;   // excess bits
  86.     int index = 0;
  87.     for (int ix=0; ix<data.length; ix++)
  88.     {
  89.         int value = codes[ data[ix] & 0xFF ];   // ignore high byte of char
  90.         if ( value >= 0 ) {                     // skip over non-code
  91.             accum <<= 6;            // bits shift up by 6 each time thru
  92.             shift += 6;             // loop, with new bits being put in
  93.             accum |= value;         // at the bottom.
  94.             if ( shift >= 8 ) {     // whenever there are 8 or more shifted in,
  95.                 shift -= 8;         // write them out (from the top, leaving any
  96.                 out[index++] =      // excess at the bottom for next iteration.
  97.                     (byte) ((accum >> shift) & 0xff);
  98.     }   }   }
  99.     if (index != out.length)
  100.         throw new Error("miscalculated data length!");
  101.     return out;
  102. }
  103. //
  104. // code characters for values 0..63
  105. //
  106. static private char[] alphabet =
  107.     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
  108.         .toCharArray();
  109. //
  110. // lookup table for converting base64 characters to value in range 0..63
  111. //
  112. static private byte[] codes = new byte[256];
  113. static {
  114.     for (int i=0; i<256; i++) codes[i] = -1;
  115.     for (int i = 'A'; i <= 'Z'; i++) codes[i] = (byte)(     i - 'A');
  116.     for (int i = 'a'; i <= 'z'; i++) codes[i] = (byte)(26 + i - 'a');
  117.     for (int i = '0'; i <= '9'; i++) codes[i] = (byte)(52 + i - '0');
  118.     codes['+'] = 62;
  119.     codes['/'] = 63;
  120. }
  121. }