1 27 package soot.tagkit; 28 29 39 public class Base64 { 40 41 48 static public char[] encode(byte[] data) 49 { 50 char[] out = new char[((data.length + 2) / 3) * 4]; 51 52 for (int i=0, index=0; i<data.length; i+=3, index+=4) { 57 boolean quad = false; 58 boolean trip = false; 59 60 int val = (0xFF & (int) data[i]); 61 val <<= 8; 62 if ((i+1) < data.length) { 63 val |= (0xFF & (int) data[i+1]); 64 trip = true; 65 } 66 val <<= 8; 67 if ((i+2) < data.length) { 68 val |= (0xFF & (int) data[i+2]); 69 quad = true; 70 } 71 out[index+3] = alphabet[(quad? (val & 0x3F): 64)]; 72 val >>= 6; 73 out[index+2] = alphabet[(trip? (val & 0x3F): 64)]; 74 val >>= 6; 75 out[index+1] = alphabet[val & 0x3F]; 76 val >>= 6; 77 out[index+0] = alphabet[val & 0x3F]; 78 } 79 return out; 80 } 81 82 93 static public byte[] decode(char[] data) 94 { 95 102 int tempLen = data.length; 103 for( int ix=0; ix<data.length; ix++ ) 104 { 105 if( (data[ix] > 255) || codes[ data[ix] ] < 0 ) 106 --tempLen; } 108 113 int len = (tempLen / 4) * 3; 114 if ((tempLen % 4) == 3) len += 2; 115 if ((tempLen % 4) == 2) len += 1; 116 117 byte[] out = new byte[len]; 118 119 120 121 int shift = 0; int accum = 0; int index = 0; 124 125 for (int ix=0; ix<data.length; ix++) 127 { 128 int value = (data[ix]>255)? -1: codes[ data[ix] ]; 129 130 if ( value >= 0 ) { 132 accum <<= 6; shift += 6; accum |= value; if ( shift >= 8 ) { 137 shift -= 8; out[index++] = (byte) ((accum >> shift) & 0xff); 140 } 141 } 142 } 149 150 if( index != out.length) 152 { 153 throw new Error ("Miscalculated data length (wrote " + index + " instead of " + out.length + ")"); 154 } 155 156 return out; 157 } 158 159 160 static private char[] alphabet = 164 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" 165 .toCharArray(); 166 167 static private byte[] codes = new byte[256]; 171 static { 172 for (int i=0; i<256; i++) codes[i] = -1; 173 for (int i = 'A'; i <= 'Z'; i++) codes[i] = (byte)( i - 'A'); 174 for (int i = 'a'; i <= 'z'; i++) codes[i] = (byte)(26 + i - 'a'); 175 for (int i = '0'; i <= '9'; i++) codes[i] = (byte)(52 + i - '0'); 176 codes['+'] = 62; 177 codes['/'] = 63; 178 } 179 180 } 181 | Popular Tags |