2

我有这个 GZIPed 字符串: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

我在这里想念什么?

一个JSbin

4

2 回答 2

1

此字符串是 base64 编码的。

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

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

然后你可以解压缩它:

const unzippedBuffer = ungzip(gzippedBuffer);

结果ungzipUnit8Array. 如果要将其转换回字符串,则需要再次对其进行解码:

const unzippedString = new TextDecoder('utf8').decode(unzipped);
于 2021-09-14T14:20:55.300 回答
1

"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,并且您需要将解码后的数据转换为Uint8Array使用 例如 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>

于 2021-09-14T14:21:15.220 回答