解决pako.js解压过长(大)数据时报错的问题

背景

最近做的一个项目,传输的数据量较大所以想到了用压缩数据的方法来处理,后台用了自带的gzip库。而前端解压找到了 pako.js 这个完美的库。但是几次尝试后发现数据量一大就解压失败报错。
pako.min.js 百度网盘下载地址:
链接:https://pan.baidu.com/s/1nxZqqlN7ZfYYMldnvvrC1A
提取码:285z

pako 解压方法(不能解压过大的数据)

function unzip(b64Data){
  var strData   = atob(b64Data);
  // Convert binary string to character-number array
  var charData  = strData.split('').map(function(x){return x.charCodeAt(0);});
  // Turn number array into byte-array
  var binData   = new Uint8Array(charData);
  // // unzip
  var data    = pako.inflate(binData);
  // Convert gunzipped byteArray back to ascii string:
  strData   = String.fromCharCode.apply(null, new Uint16Array(data));
  return strData;
}

错误信息

当数据量过大的时候会出现如下的错误信息:

RangeError: too many arguments provided for a function call

但是根据错误提示根本不能找到正确的解决问题的方向。

解决思路

只有数据量过大才会导致出错,说明 String.fromCharCode.apply 不能接受过长的数组,那么我们可以想到将数组进行拆分->解压->拼接。

解决代码

  array = new Uint16Array(data)
  var res = '';
  var chunk = 8 * 1024;
  var i;
  for (i = 0; i < array.length / chunk; i++) {
     res += String.fromCharCode.apply(null, array.slice(i * chunk, (i + 1) * chunk)); 
    }
  res += String.fromCharCode.apply(null, array.slice(i * chunk));

  strData = res

完整代码

function unzip(b64Data){
  var strData   = atob(b64Data);
  // Convert binary string to character-number array
  var charData  = strData.split('').map(function(x){return x.charCodeAt(0);});
  // Turn number array into byte-array
  var binData   = new Uint8Array(charData);
  // // unzip
  var data    = pako.inflate(binData);
  // Convert gunzipped byteArray back to ascii string:
  // strData   = String.fromCharCode.apply(null, new Uint16Array(data));
  array = new Uint16Array(data)
  var res = '';
  var chunk = 8 * 1024;
  var i;
  for (i = 0; i < array.length / chunk; i++) {
     res += String.fromCharCode.apply(null, array.slice(i * chunk, (i + 1) * chunk)); 
    }
  res += String.fromCharCode.apply(null, array.slice(i * chunk));

  strData = res
  return strData;
} 

这样就可以解压任意大小的数据啦啦啦。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,793评论 1 32
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,788评论 0 9
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,961评论 1 45
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,193评论 4 61
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,091评论 0 3