我想用 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
我在这里错过了什么?
这个字符串是 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>
我有这个 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
我在这里错过了什么?
这个字符串是 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>