Android和服务端数据交互使用压缩


公司一个用户数据过大,导致android与服务端通讯速度太慢,通过分析,最小改动方式使用数据压缩,不压缩前数据大概5M压缩后只有20k.

服务端使用gzip压缩。客户端androi使用类解压缩,在网上找了一个工具类如下。解决。

public final class Base64Utils {
    private static final int BASELENGTH = 128;
    private static final int LOOKUPLENGTH = 64;
    private static final int TWENTYFOURBITGROUP = 24;
    private static final int EIGHTBIT = 8;
    private static final int SIXTEENBIT = 16;
    private static final int SIXBIT = 6;
    private static final int FOURBYTE = 4;
    private static final int SIGN = -128;
    private static final char PAD = '=';
    private static final boolean fDebug = false;
    private static final byte[] base64Alphabet = new byte[128];
    private static final char[] lookUpBase64Alphabet = new char[64];

    public Base64Utils() {
    }

    protected static boolean isWhiteSpace(char octect) {
        return octect == 32 || octect == 13 || octect == 10 || octect == 9;
    }

    protected static boolean isPad(char octect) {
        return octect == 61;
    }

    protected static boolean isData(char octect) {
        return octect < 128 && base64Alphabet[octect] != -1;
    }

    protected static boolean isBase64(char octect) {
        return isWhiteSpace(octect) || isPad(octect) || isData(octect);
    }

    public static String encode(byte[] binaryData) {
        if(binaryData == null) {
            return null;
        } else {
            int lengthDataBits = binaryData.length * 8;
            if(lengthDataBits == 0) {
                return "";
            } else {
                int fewerThan24bits = lengthDataBits % 24;
                int numberTriplets = lengthDataBits / 24;
                int numberQuartet = fewerThan24bits != 0?numberTriplets + 1:numberTriplets;
                Object encodedData = null;
                char[] var17 = new char[numberQuartet * 4];
                boolean k = false;
                boolean l = false;
                boolean b1 = false;
                boolean b2 = false;
                boolean b3 = false;
                int encodedIndex = 0;
                int dataIndex = 0;

                byte val2;
                byte var18;
                byte var19;
                byte var20;
                byte var21;
                for(int val1 = 0; val1 < numberTriplets; ++val1) {
                    var20 = binaryData[dataIndex++];
                    var21 = binaryData[dataIndex++];
                    byte var22 = binaryData[dataIndex++];
                    var19 = (byte)(var21 & 15);
                    var18 = (byte)(var20 & 3);
                    val2 = (var20 & -128) == 0?(byte)(var20 >> 2):(byte)(var20 >> 2 ^ 192);
                    byte val21 = (var21 & -128) == 0?(byte)(var21 >> 4):(byte)(var21 >> 4 ^ 240);
                    byte val3 = (var22 & -128) == 0?(byte)(var22 >> 6):(byte)(var22 >> 6 ^ 252);
                    var17[encodedIndex++] = lookUpBase64Alphabet[val2];
                    var17[encodedIndex++] = lookUpBase64Alphabet[val21 | var18 << 4];
                    var17[encodedIndex++] = lookUpBase64Alphabet[var19 << 2 | val3];
                    var17[encodedIndex++] = lookUpBase64Alphabet[var22 & 63];
                }

                byte var23;
                if(fewerThan24bits == 8) {
                    var20 = binaryData[dataIndex];
                    var18 = (byte)(var20 & 3);
                    var23 = (var20 & -128) == 0?(byte)(var20 >> 2):(byte)(var20 >> 2 ^ 192);
                    var17[encodedIndex++] = lookUpBase64Alphabet[var23];
                    var17[encodedIndex++] = lookUpBase64Alphabet[var18 << 4];
                    var17[encodedIndex++] = 61;
                    var17[encodedIndex++] = 61;
                } else if(fewerThan24bits == 16) {
                    var20 = binaryData[dataIndex];
                    var21 = binaryData[dataIndex + 1];
                    var19 = (byte)(var21 & 15);
                    var18 = (byte)(var20 & 3);
                    var23 = (var20 & -128) == 0?(byte)(var20 >> 2):(byte)(var20 >> 2 ^ 192);
                    val2 = (var21 & -128) == 0?(byte)(var21 >> 4):(byte)(var21 >> 4 ^ 240);
                    var17[encodedIndex++] = lookUpBase64Alphabet[var23];
                    var17[encodedIndex++] = lookUpBase64Alphabet[val2 | var18 << 4];
                    var17[encodedIndex++] = lookUpBase64Alphabet[var19 << 2];
                    var17[encodedIndex++] = 61;
                }

                return new String(var17);
            }
        }
    }

    public static byte[] decode(String encoded) {
        if(encoded == null) {
            return null;
        } else {
            char[] base64Data = encoded.toCharArray();
            int len = removeWhiteSpace(base64Data);
            if(len % 4 != 0) {
                return null;
            } else {
                int numberQuadruple = len / 4;
                if(numberQuadruple == 0) {
                    return new byte[0];
                } else {
                    Object decodedData = null;
                    boolean b1 = false;
                    boolean b2 = false;
                    boolean b3 = false;
                    boolean b4 = false;
                    boolean d1 = false;
                    boolean d2 = false;
                    boolean d3 = false;
                    boolean d4 = false;
                    int i = 0;
                    int encodedIndex = 0;
                    int dataIndex = 0;

                    byte[] var17;
                    byte var18;
                    byte var19;
                    byte var20;
                    byte var21;
                    char var22;
                    char var23;
                    char var24;
                    char var25;
                    for(var17 = new byte[numberQuadruple * 3]; i < numberQuadruple - 1; ++i) {
                        if(!isData(var22 = base64Data[dataIndex++]) || !isData(var23 = base64Data[dataIndex++]) || !isData(var24 = base64Data[dataIndex++]) || !isData(var25 = base64Data[dataIndex++])) {
                            return null;
                        }

                        var18 = base64Alphabet[var22];
                        var19 = base64Alphabet[var23];
                        var20 = base64Alphabet[var24];
                        var21 = base64Alphabet[var25];
                        var17[encodedIndex++] = (byte)(var18 << 2 | var19 >> 4);
                        var17[encodedIndex++] = (byte)((var19 & 15) << 4 | var20 >> 2 & 15);
                        var17[encodedIndex++] = (byte)(var20 << 6 | var21);
                    }

                    if(isData(var22 = base64Data[dataIndex++]) && isData(var23 = base64Data[dataIndex++])) {
                        var18 = base64Alphabet[var22];
                        var19 = base64Alphabet[var23];
                        var24 = base64Data[dataIndex++];
                        var25 = base64Data[dataIndex++];
                        if(isData(var24) && isData(var25)) {
                            var20 = base64Alphabet[var24];
                            var21 = base64Alphabet[var25];
                            var17[encodedIndex++] = (byte)(var18 << 2 | var19 >> 4);
                            var17[encodedIndex++] = (byte)((var19 & 15) << 4 | var20 >> 2 & 15);
                            var17[encodedIndex++] = (byte)(var20 << 6 | var21);
                            return var17;
                        } else {
                            byte[] tmp;
                            if(isPad(var24) && isPad(var25)) {
                                if((var19 & 15) != 0) {
                                    return null;
                                } else {
                                    tmp = new byte[i * 3 + 1];
                                    System.arraycopy(var17, 0, tmp, 0, i * 3);
                                    tmp[encodedIndex] = (byte)(var18 << 2 | var19 >> 4);
                                    return tmp;
                                }
                            } else if(!isPad(var24) && isPad(var25)) {
                                var20 = base64Alphabet[var24];
                                if((var20 & 3) != 0) {
                                    return null;
                                } else {
                                    tmp = new byte[i * 3 + 2];
                                    System.arraycopy(var17, 0, tmp, 0, i * 3);
                                    tmp[encodedIndex++] = (byte)(var18 << 2 | var19 >> 4);
                                    tmp[encodedIndex] = (byte)((var19 & 15) << 4 | var20 >> 2 & 15);
                                    return tmp;
                                }
                            } else {
                                return null;
                            }
                        }
                    } else {
                        return null;
                    }
                }
            }
        }
    }

    protected static int removeWhiteSpace(char[] data) {
        if(data == null) {
            return 0;
        } else {
            int newSize = 0;
            int len = data.length;

            for(int i = 0; i < len; ++i) {
                if(!isWhiteSpace(data[i])) {
                    data[newSize++] = data[i];
                }
            }

            return newSize;
        }
    }

    static {
        int i;
        for(i = 0; i < 128; ++i) {
            base64Alphabet[i] = -1;
        }

        for(i = 90; i >= 65; --i) {
            base64Alphabet[i] = (byte)(i - 65);
        }

        for(i = 122; i >= 97; --i) {
            base64Alphabet[i] = (byte)(i - 97 + 26);
        }

        for(i = 57; i >= 48; --i) {
            base64Alphabet[i] = (byte)(i - 48 + 52);
        }

        base64Alphabet[43] = 62;
        base64Alphabet[47] = 63;

        for(i = 0; i <= 25; ++i) {
            lookUpBase64Alphabet[i] = (char)(65 + i);
        }

        i = 26;

        int j;
        for(j = 0; i <= 51; ++j) {
            lookUpBase64Alphabet[i] = (char)(97 + j);
            ++i;
        }

        i = 52;

        for(j = 0; i <= 61; ++j) {
            lookUpBase64Alphabet[i] = (char)(48 + j);
            ++i;
        }

        lookUpBase64Alphabet[62] = 43;
        lookUpBase64Alphabet[63] = 47;
    }

CompressUtils.java

public static String compresss(String str){
    if (str == null || str.length() == 0) {
        return str;
    }
    String outStr = "";
    try {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(out);
        gzip.write(str.getBytes());
        gzip.close();
        outStr = new String(Base64Utils.encode(out.toByteArray()));
    }catch (Exception e){
        e.printStackTrace();
    }
    return outStr;
}

public static String decompresss(String str) throws IOException {
    if (str == null || str.length() == 0) {
        return str;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(Base64Utils.decode(str)));
        String outStr = "";
        byte[] buffer = new byte[256];
        int n;
        while ((n = gis.read(buffer)) >= 0) {
            out.write(buffer, 0, n);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return new String(out.toByteArray());
}

————————————————
版权声明:本文为CSDN博主「abs625」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/abs625/article/details/76552576