我想用 JavaScript 解压缩 GZIP 字符串

I want to decompress a GZIP string with JavaScript

我有这个 GZIP 压缩后的字符串:H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA==

我用这个网站创建的:http://www.txtwizard.net/compression

我试过使用 pako 来解压它。

import { ungzip } from 'pako';

const textEncoder = new TextEncoder();
const gzipedData = textEncoder.encode("H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA==");
console.log('gzipeddata', gzipedData);
const ungzipedData = ungzip(gzipedData);
console.log('ungziped data', ungzipedData);

问题是 Pako 抛出错误:incorrect header check

我在这里错过了什么?

A JSbin

这个字符串是 base64 编码的。

您首先需要将其解码到缓冲区:

const gzippedString = 'H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA==';
const gzippedBuffer = new Buffer(gzippedString, 'base64');

然后你可以解压它:

const unzippedBuffer = ungzip(gzippedBuffer);

ungzip 的结果是 Unit8Array。如果您想将其转换回字符串,您需要再次对其进行解码:

const unzippedString = new TextDecoder('utf8').decode(unzipped);

"H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA=="是一个base64编码的字符串,您首先需要将其解码到缓冲区中。

textEncoder.encode 只是将 base64 编码的字符串编码成字节流。

如何操作取决于您是在浏览器中还是在 nodejs 上。

node.js版本

要将解压缩的数据转换为字符串,您还可以使用 new TextDecoder().decode()

对于节点,您将使用 Buffer.from(string, 'base64') 解码 base64 编码的字符串:

import { ungzip } from 'pako';

// decode the base64 encoded data
const gzipedData = Buffer.from("H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA==", "base64");

console.log('gzipeddata', gzipedData);
const ungzipedData = ungzip(gzipedData);


console.log('ungziped data', new TextDecoder().decode(ungzipedData));

浏览器版本

在浏览器中,您必须使用atob, and you need to convert the decoded data to an Uint8Array using e.g. Uint8Array.from

我使用的转换来自 Convert base64 string to ArrayBuffer,您可能需要验证它是否适用于所有情况。

// decode the base64 encoded data
const gezipedData = atob("H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA==")
const gzipedDataArray = Uint8Array.from(gezipedData, c => c.charCodeAt(0))

console.log('gzipeddata', gzipedDataArray);
const ungzipedData = pako.ungzip(gzipedDataArray);


console.log('ungziped data', new TextDecoder().decode(ungzipedData));
<script src="https://cdnjs.cloudflare.com/ajax/libs/pako/2.0.4/pako.min.js"></script>