使用pako 2.1.0进行gzip解压报错:incorrect header check
使用pako 2.1.0解压时报错:Error: incorrect header check
问题场景
使用pako 2.1.0做压缩解压操作,因库不支持直接传入字符串,改用Uint8Array处理,但解压阶段无法正常工作,触发头校验错误。
测试数据
const data = { "AgreementId": "131", "Type": "Admin", "validFrom": "2020-07-12", "validTo": "2021-08-10", "internalDescription": "InternalDescrip", "customerName": "Test Customer" }
压缩编码代码
const uint8Array = new TextEncoder().encode(JSON.stringify(data)) const compressedData = gzip(uint8Array) const base64EncodedData = base64Encode(compressedData)
解压解码代码(原错误版本)
const strData = base64Decode(base64EncodedData); const charData = strData.split('').map(function(x){return x.charCodeAt(0); }); console.log(charData,"CHARDATA") const binData = new Uint8Array(charData); console.log(binData,"BINDATA") const result = ungzip(binData, { to: 'string' }, { raw: true }); console.log(result,"RESULT");
错误信息
解压时触发错误:Error: incorrect header check
问题原因与解决方法
核心问题
原解压流程中,base64Decode将二进制数据转成字符串的操作破坏了原始压缩数据——字符串无法正确映射所有二进制字节(比如非UTF-8兼容的控制字节),转回Uint8Array后的数据已和压缩后的原始数据不一致,导致pako识别不出合法的gzip头。
正确的解压流程
跳过字符串中转步骤,直接将base64解码结果转为Uint8Array:
浏览器环境修正代码
// 直接将base64解码为Uint8Array const binData = Uint8Array.from(atob(base64EncodedData), c => c.charCodeAt(0)); const result = pako.ungzip(binData, { to: 'string' }); console.log(result);
Node.js环境修正代码
const binData = Buffer.from(base64EncodedData, 'base64'); const result = pako.ungzip(binData, { to: 'string' }); console.log(result);
额外注意事项
- 移除解压时的
{ raw: true }参数:该参数用于处理原始deflate格式数据,而gzip()生成的是带标准gzip头的压缩数据,启用该参数会跳过gzip头校验,反而引发错误。 - 确保
base64Encode/base64Decode是针对二进制数据实现的:浏览器用btoa/atob配合Uint8Array操作,Node.js直接用Buffer的base64编解码方法。
内容的提问来源于stack exchange,提问作者V2rson
相关产品推荐
相关产品推荐

