You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:52:48