J2ME下的Base64的编码与解码

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
J2SE里内置了Base64的编码器与解码器,可是J2ME里没有可用的库。SO,还是要自己来DIY啊...
J2ME下实现BASE64编码与解码的源代码如下:
  1. import java.io.*;     
  2.        
  3. public class Base64 {     
  4.      private static char[] base64EncodeChars = new char[] {     
  5.          'A''B''C''D''E''F''G''H',     
  6.          'I''J''K''L''M''N''O''P',     
  7.          'Q''R''S''T''U''V''W''X',     
  8.          'Y''Z''a''b''c''d''e''f',     
  9.          'g''h''i''j''k''l''m''n',     
  10.          'o''p''q''r''s''t''u''v',     
  11.          'w''x''y''z''0''1''2''3',     
  12.          '4''5''6''7''8''9''+''/' };     
  13.        
  14.      private static byte[] base64DecodeChars = new byte[] {     
  15.      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,     
  16.      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,     
  17.      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -162, -1, -1, -163,     
  18.      52535455565758596061, -1, -1, -1, -1, -1, -1,     
  19.      -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  91011121314,     
  20.      1516171819202122232425, -1, -1, -1, -1, -1,     
  21.      -1262728293031323334353637383940,     
  22.      4142434445464748495051, -1, -1, -1, -1, -1 };     
  23.        
  24.      private Base64() {}     
  25.        
  26.      public static String encode(byte[] data) {     
  27.          StringBuffer sb = new StringBuffer();     
  28.          int len = data.length;     
  29.          int i = 0;     
  30.          int b1, b2, b3;     
  31.        
  32.          while (i < len) {     
  33.              b1 = data[i++] & 0xff;     
  34.              if (i == len) {     
  35.                  sb.append(base64EncodeChars[b1 >>> 2]);     
  36.                  sb.append(base64EncodeChars[(b1 & 0x3) << 4]);     
  37.                  sb.append("==");     
  38.                  break;     
  39.              }     
  40.              b2 = data[i++] & 0xff;     
  41.              if (i == len) {     
  42.                  sb.append(base64EncodeChars[b1 >>> 2]);     
  43.                  sb.append(     
  44.                          base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);     
  45.                  sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);     
  46.                  sb.append("=");     
  47.                  break;     
  48.              }     
  49.              b3 = data[i++] & 0xff;     
  50.              sb.append(base64EncodeChars[b1 >>> 2]);     
  51.              sb.append(     
  52.                      base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);     
  53.              sb.append(     
  54.                      base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);     
  55.              sb.append(base64EncodeChars[b3 & 0x3f]);     
  56.          }     
  57.          return sb.toString();     
  58.      }     
  59.        
  60.      public static byte[] decode(String str) {     
  61.          byte[] data = str.getBytes();     
  62.          int len = data.length;     
  63.          ByteArrayOutputStream buf = new ByteArrayOutputStream(len);     
  64.          int i = 0;     
  65.          int b1, b2, b3, b4;     
  66.        
  67.          while (i < len) {     
  68.        
  69.              /* b1 */     
  70.              do {     
  71.                  b1 = base64DecodeChars[data[i++]];     
  72.              } while (i < len && b1 == -1);     
  73.              if (b1 == -1) {     
  74.                  break;     
  75.              }     
  76.        
  77.              /* b2 */     
  78.              do {     
  79.                  b2 = base64DecodeChars[data[i++]];     
  80.              } while (i < len && b2 == -1);     
  81.              if (b2 == -1) {     
  82.                  break;     
  83.              }     
  84.              buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));     
  85.        
  86.              /* b3 */     
  87.              do {     
  88.                  b3 = data[i++];     
  89.                  if (b3 == 61) {     
  90.                      return buf.toByteArray();     
  91.                  }     
  92.                  b3 = base64DecodeChars[b3];     
  93.              } while (i < len && b3 == -1);     
  94.              if (b3 == -1) {     
  95.                  break;     
  96.              }     
  97.              buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));     
  98.        
  99.              /* b4 */     
  100.              do {     
  101.                  b4 = data[i++];     
  102.                  if (b4 == 61) {     
  103.                      return buf.toByteArray();     
  104.                  }     
  105.                  b4 = base64DecodeChars[b4];     
  106.              } while (i < len && b4 == -1);     
  107.              if (b4 == -1) {     
  108.                  break;     
  109.              }     
  110.              buf.write((int) (((b3 & 0x03) << 6) | b4));     
  111.          }     
  112.          return buf.toByteArray();     
  113.      }     
  114.  }  

你可能感兴趣的:(学习笔记,j2me,j2se,byte,网络,c)