用deflate算法实现GZIP解压
Implement GZIP decompression with deflate algorithm
我需要从 JavaScript 中解压缩 Base64 编码的 gzip
或 deflate
数据而不增加包的大小(这就是为什么我不能只使用 pako
).我找到了一个不错的小型库,用于解压 deflate
数据,名为 UZIP
。
看起来 gzip
只是 deflate
加上 10 字节的 header 和 8 字节的页脚。保证数据没有任何损坏,也没有超过这十个字节的任何额外 headers。考虑到所有这些,我假设我可以只对数据进行 Base64 解码,将其转换为 Uint8Array
,然后切掉 header 和页脚。
const data = // some Base64-encoded, gzipped string
const dataBytes = new Uint8Array(atob(data).split('').map(char => char.charCodeAt(0)));
const decompressed = UZIP.inflate(dataBytes.slice(10, -8));
此代码无限期挂起(可能是因为 UZIP
错误处理不当)。我尝试在 Node.js 和浏览器上使用 pako
和 zlib
,但都抱怨 header 无效。作为参考,从 Base64 解码后使用 zlib.gunzip
,以及 运行 pako.inflate
(自动检测压缩类型),都可以正确解压缩 gzip 数据。
是否可以从 gzip 字符串中提取原始 deflate
数据?如果没有,有没有可以同时解压gzip
和deflate
的轻量级库?
我发现 deflate
规范不包含头文件,但是 zlib
包含,并且许多库调用 zlib
解压 inflate
,而调用 true [=19] =] inflateRaw
。我将我的方法调用从 inflate
更改为 inflateRaw
,它立即起作用。
我需要从 JavaScript 中解压缩 Base64 编码的 gzip
或 deflate
数据而不增加包的大小(这就是为什么我不能只使用 pako
).我找到了一个不错的小型库,用于解压 deflate
数据,名为 UZIP
。
看起来 gzip
只是 deflate
加上 10 字节的 header 和 8 字节的页脚。保证数据没有任何损坏,也没有超过这十个字节的任何额外 headers。考虑到所有这些,我假设我可以只对数据进行 Base64 解码,将其转换为 Uint8Array
,然后切掉 header 和页脚。
const data = // some Base64-encoded, gzipped string
const dataBytes = new Uint8Array(atob(data).split('').map(char => char.charCodeAt(0)));
const decompressed = UZIP.inflate(dataBytes.slice(10, -8));
此代码无限期挂起(可能是因为 UZIP
错误处理不当)。我尝试在 Node.js 和浏览器上使用 pako
和 zlib
,但都抱怨 header 无效。作为参考,从 Base64 解码后使用 zlib.gunzip
,以及 运行 pako.inflate
(自动检测压缩类型),都可以正确解压缩 gzip 数据。
是否可以从 gzip 字符串中提取原始 deflate
数据?如果没有,有没有可以同时解压gzip
和deflate
的轻量级库?
我发现 deflate
规范不包含头文件,但是 zlib
包含,并且许多库调用 zlib
解压 inflate
,而调用 true [=19] =] inflateRaw
。我将我的方法调用从 inflate
更改为 inflateRaw
,它立即起作用。