我想用JavaScript解压一个GZIP字符串



我有这个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

我在这里错过了什么?

一个JSbin

"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.from将解码的数据转换为Uint8Array

我使用的转换是从Convert base64 string到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>

该字符串为base64编码。

你首先需要解码到一个缓冲区:

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

然后你可以运行(g)压缩它:

const unzippedBuffer = ungzip(gzippedBuffer);

ungzip的结果是Unit8Array。如果你想把它转换回字符串,你需要再解码一次:

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

相关内容

  • 没有找到相关文章

最新更新