java压缩传输的数据和js解压缩

// java压缩后通过base64编码返回前端, 下面方法仅为压缩方法
private static byte[] compress(byte[] inputByte) throws IOException {
    int len = 0;
    Deflater defl = new Deflater();
    defl.setInput(inputByte);
    defl.finish();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] outputByte = new byte[1024];
    try {
        while (!defl.finished()) {
            // 压缩并将压缩后的内容输出到字节输出流bos中
            len = defl.deflate(outputByte);
            bos.write(outputByte, 0, len);
        }
        defl.end();
    } finally {
        bos.close();
    }
    return bos.toByteArray();
}

// js解压缩, 通过js-base64 和pako.js来解压缩还原数据

// js-base64 和pako.js 需要自行搜索

let str = res.msg,
  decode64Str = Base64.atob(str),
  charData = decode64Str.split('').map(function(x) { return x.charCodeAt(0) }),
  binData = new Uint8Array(charData),
  pakoData = pako.inflate(binData),
  result = String.fromCharCode.apply(null, new Uint16Array(pakoData)),
  resultData = JSON.parse(decodeURI(result))  // 这里是最后解压出来的数据

// 如果js报出了Maximum call stack size 堆栈溢出的错误, 则可以把String.fromCharCode.apply方法替换为如下方法:

function handleCodePoints(array) {

        var CHUNK_SIZE = 0x8000; // arbitrary number here, not too small, not too big

        var index = 0;

        var length = array.length;

        var result = '';

        var slice;

        var arr = [];

        for (var i = 0, _i = array.length; i < _i; i++) {

            arr[i] = array[i];

        }

        while (index < length) {

            slice = arr.slice(index, Math.min(index + CHUNK_SIZE, length)); // `Math.min` is not really necessary here I think

            result += String.fromCharCode.apply(null, slice);

            index += CHUNK_SIZE;

        }

        return result;

    }


版权声明:本文为qq_41728752原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。