摘自微信SDK的Base64算法

摘自微信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;
    }
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值