摘自微信SDK的Base64算法
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.tencent.mm.algorithm;
import java.util.Arrays;
public class Base64 {
private static final char[] a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
private static final int[] b;
public Base64() {
}
public static final char[] encodeToChar(byte[] var0, boolean var1) {
int var2;
if((var2 = var0 != null?var0.length:0) == 0) {
return new char[0];
} else {
int var3 = var2 / 3 * 3;
int var4;
char[] var5 = new char[var4 = (var4 = (var2 - 1) / 3 + 1 << 2) + (var1?(var4 - 1) / 76 << 1:0)];
int var6 = 0;
int var7 = 0;
int var8 = 0;
while(var6 < var3) {
int var9 = (var0[var6++] & 255) << 16 | (var0[var6++] & 255) << 8 | var0[var6++] & 255;
var5[var7++] = a[var9 >>> 18 & 63];
var5[var7++] = a[var9 >>> 12 & 63];
var5[var7++] = a[var9 >>> 6 & 63];
var5[var7++] = a[var9 & 63];
if(var1) {
++var8;
if(var8 == 19 && var7 < var4 - 2) {
var5[var7++] = 13;
var5[var7++] = 10;
var8 = 0;
}
}
}
if((var6 = var2 - var3) > 0) {
var7 = (var0[var3] & 255) << 10 | (var6 == 2?(var0[var2 - 1] & 255) << 2:0);
var5[var4 - 4] = a[var7 >> 12];
var5[var4 - 3] = a[var7 >>> 6 & 63];
var5[var4 - 2] = var6 == 2?a[var7 & 63]:61;
var5[var4 - 1] = 61;
}
return var5;
}
}
public static final byte[] decode(char[] var0) {
int var1;
if((var1 = var0 != null?var0.length:0) == 0) {
return new byte[0];
} else {
int var2 = 0;
int var3;
for(var3 = 0; var3 < var1; ++var3) {
if(b[var0[var3]] < 0) {
++var2;
}
}
if((var1 - var2) % 4 != 0) {
return null;
} else {
var3 = 0;
int var4 = var1;
while(var4 > 1) {
--var4;
if(b[var0[var4]] > 0) {
break;
}
if(var0[var4] == 61) {
++var3;
}
}
byte[] var8 = new byte[var4 = ((var1 - var2) * 6 >> 3) - var3];
var2 = 0;
var3 = 0;
while(var3 < var4) {
int var5 = 0;
for(int var6 = 0; var6 < 4; ++var6) {
int var7;
if((var7 = b[var0[var2++]]) >= 0) {
var5 |= var7 << 18 - var6 * 6;
} else {
--var6;
}
}
var8[var3++] = (byte)(var5 >> 16);
if(var3 < var4) {
var8[var3++] = (byte)(var5 >> 8);
if(var3 < var4) {
var8[var3++] = (byte)var5;
}
}
}
return var8;
}
}
}
public static final byte[] decodeFast(char[] var0) {
int var1;
if((var1 = var0.length) == 0) {
return new byte[0];
} else {
int var2 = 0;
int var3;
for(var3 = var1 - 1; var2 < var3 && b[var0[var2]] < 0; ++var2) {
;
}
while(var3 > 0 && b[var0[var3]] < 0) {
--var3;
}
int var4 = var0[var3] == 61?(var0[var3 - 1] == 61?2:1):0;
int var5 = var3 - var2 + 1;
var1 = var1 > 76?(var0[76] == 13?var5 / 78:0) << 1:0;
byte[] var6 = new byte[var5 = ((var5 - var1) * 6 >> 3) - var4];
int var7 = 0;
int var8 = 0;
int var9 = var5 / 3 * 3;
while(var7 < var9) {
int var10 = b[var0[var2++]] << 18 | b[var0[var2++]] << 12 | b[var0[var2++]] << 6 | b[var0[var2++]];
var6[var7++] = (byte)(var10 >> 16);
var6[var7++] = (byte)(var10 >> 8);
var6[var7++] = (byte)var10;
if(var1 > 0) {
++var8;
if(var8 == 19) {
var2 += 2;
var8 = 0;
}
}
}
if(var7 < var5) {
var8 = 0;
for(var9 = 0; var2 <= var3 - var4; ++var9) {
var8 |= b[var0[var2++]] << 18 - var9 * 6;
}
for(var9 = 16; var7 < var5; var9 -= 8) {
var6[var7++] = (byte)(var8 >> var9);
}
}
return var6;
}
}
public static final byte[] encodeToByte(byte[] var0, boolean var1) {
int var2;
if((var2 = var0 != null?var0.length:0) == 0) {
return new byte[0];
} else {
int var3 = var2 / 3 * 3;
int var4;
byte[] var5 = new byte[var4 = (var4 = (var2 - 1) / 3 + 1 << 2) + (var1?(var4 - 1) / 76 << 1:0)];
int var6 = 0;
int var7 = 0;
int var8 = 0;
while(var6 < var3) {
int var9 = (var0[var6++] & 255) << 16 | (var0[var6++] & 255) << 8 | var0[var6++] & 255;
var5[var7++] = (byte)a[var9 >>> 18 & 63];
var5[var7++] = (byte)a[var9 >>> 12 & 63];
var5[var7++] = (byte)a[var9 >>> 6 & 63];
var5[var7++] = (byte)a[var9 & 63];
if(var1) {
++var8;
if(var8 == 19 && var7 < var4 - 2) {
var5[var7++] = 13;
var5[var7++] = 10;
var8 = 0;
}
}
}
if((var6 = var2 - var3) > 0) {
var7 = (var0[var3] & 255) << 10 | (var6 == 2?(var0[var2 - 1] & 255) << 2:0);
var5[var4 - 4] = (byte)a[var7 >> 12];
var5[var4 - 3] = (byte)a[var7 >>> 6 & 63];
var5[var4 - 2] = var6 == 2?(byte)a[var7 & 63]:61;
var5[var4 - 1] = 61;
}
return var5;
}
}
public static final byte[] decode(byte[] var0) {
int var1 = var0.length;
int var2 = 0;
int var3;
for(var3 = 0; var3 < var1; ++var3) {
if(b[var0[var3] & 255] < 0) {
++var2;
}
}
if((var1 - var2) % 4 != 0) {
return null;
} else {
var3 = 0;
int var4 = var1;
while(var4 > 1) {
--var4;
if(b[var0[var4] & 255] > 0) {
break;
}
if(var0[var4] == 61) {
++var3;
}
}
byte[] var8 = new byte[var4 = ((var1 - var2) * 6 >> 3) - var3];
var2 = 0;
var3 = 0;
while(var3 < var4) {
int var5 = 0;
for(int var6 = 0; var6 < 4; ++var6) {
int var7;
if((var7 = b[var0[var2++] & 255]) >= 0) {
var5 |= var7 << 18 - var6 * 6;
} else {
--var6;
}
}
var8[var3++] = (byte)(var5 >> 16);
if(var3 < var4) {
var8[var3++] = (byte)(var5 >> 8);
if(var3 < var4) {
var8[var3++] = (byte)var5;
}
}
}
return var8;
}
}
public static final byte[] decodeFast(byte[] var0) {
int var1;
if((var1 = var0.length) == 0) {
return new byte[0];
} else {
int var2 = 0;
int var3;
for(var3 = var1 - 1; var2 < var3 && b[var0[var2] & 255] < 0; ++var2) {
;
}
while(var3 > 0 && b[var0[var3] & 255] < 0) {
--var3;
}
int var4 = var0[var3] == 61?(var0[var3 - 1] == 61?2:1):0;
int var5 = var3 - var2 + 1;
var1 = var1 > 76?(var0[76] == 13?var5 / 78:0) << 1:0;
byte[] var6 = new byte[var5 = ((var5 - var1) * 6 >> 3) - var4];
int var7 = 0;
int var8 = 0;
int var9 = var5 / 3 * 3;
while(var7 < var9) {
int var10 = b[var0[var2++]] << 18 | b[var0[var2++]] << 12 | b[var0[var2++]] << 6 | b[var0[var2++]];
var6[var7++] = (byte)(var10 >> 16);
var6[var7++] = (byte)(var10 >> 8);
var6[var7++] = (byte)var10;
if(var1 > 0) {
++var8;
if(var8 == 19) {
var2 += 2;
var8 = 0;
}
}
}
if(var7 < var5) {
var8 = 0;
for(var9 = 0; var2 <= var3 - var4; ++var9) {
var8 |= b[var0[var2++]] << 18 - var9 * 6;
}
for(var9 = 16; var7 < var5; var9 -= 8) {
var6[var7++] = (byte)(var8 >> var9);
}
}
return var6;
}
}
public static final String encodeToString(byte[] var0, boolean var1) {
return new String(encodeToChar(var0, var1));
}
public static final byte[] decode(String var0) {
int var1;
if((var1 = var0 != null?var0.length():0) == 0) {
return new byte[0];
} else {
int var2 = 0;
int var3;
for(var3 = 0; var3 < var1; ++var3) {
if(b[var0.charAt(var3)] < 0) {
++var2;
}
}
if((var1 - var2) % 4 != 0) {
return null;
} else {
var3 = 0;
int var4 = var1;
while(var4 > 1) {
--var4;
if(b[var0.charAt(var4)] > 0) {
break;
}
if(var0.charAt(var4) == 61) {
++var3;
}
}
byte[] var8 = new byte[var4 = ((var1 - var2) * 6 >> 3) - var3];
var2 = 0;
var3 = 0;
while(var3 < var4) {
int var5 = 0;
for(int var6 = 0; var6 < 4; ++var6) {
int var7;
if((var7 = b[var0.charAt(var2++)]) >= 0) {
var5 |= var7 << 18 - var6 * 6;
} else {
--var6;
}
}
var8[var3++] = (byte)(var5 >> 16);
if(var3 < var4) {
var8[var3++] = (byte)(var5 >> 8);
if(var3 < var4) {
var8[var3++] = (byte)var5;
}
}
}
return var8;
}
}
}
public static final byte[] decodeFast(String var0) {
int var1;
if((var1 = var0.length()) == 0) {
return new byte[0];
} else {
int var2 = 0;
int var3;
for(var3 = var1 - 1; var2 < var3 && b[var0.charAt(var2) & 255] < 0; ++var2) {
;
}
while(var3 > 0 && b[var0.charAt(var3) & 255] < 0) {
--var3;
}
int var4 = var0.charAt(var3) == 61?(var0.charAt(var3 - 1) == 61?2:1):0;
int var5 = var3 - var2 + 1;
var1 = var1 > 76?(var0.charAt(76) == 13?var5 / 78:0) << 1:0;
byte[] var6 = new byte[var5 = ((var5 - var1) * 6 >> 3) - var4];
int var7 = 0;
int var8 = 0;
int var9 = var5 / 3 * 3;
while(var7 < var9) {
int var10 = b[var0.charAt(var2++)] << 18 | b[var0.charAt(var2++)] << 12 | b[var0.charAt(var2++)] << 6 | b[var0.charAt(var2++)];
var6[var7++] = (byte)(var10 >> 16);
var6[var7++] = (byte)(var10 >> 8);
var6[var7++] = (byte)var10;
if(var1 > 0) {
++var8;
if(var8 == 19) {
var2 += 2;
var8 = 0;
}
}
}
if(var7 < var5) {
var8 = 0;
for(var9 = 0; var2 <= var3 - var4; ++var9) {
var8 |= b[var0.charAt(var2++)] << 18 - var9 * 6;
}
for(var9 = 16; var7 < var5; var9 -= 8) {
var6[var7++] = (byte)(var8 >> var9);
}
}
return var6;
}
}
static {
Arrays.fill(b = new int[256], -1);
int var0 = 0;
for(int var1 = a.length; var0 < var1; b[a[var0]] = var0++) {
;
}
b[61] = 0;
}
}