Tengo esta cadena GZIPed: H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA==
Lo creé con este sitio web: http://www.txtwizard.net/compression
He intentado usar pako para descomprimirlo.
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); El tema es que Pako arroja el error: incorrect header check
¿Que me estoy perdiendo aqui?
Esta cadena está codificada en base64.
Primero debe decodificarlo en un búfer:
const gzippedString = 'H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA=='; const gzippedBuffer = new Buffer(gzippedString, 'base64');Luego puedes descomprimirlo:
const unzippedBuffer = ungzip(gzippedBuffer); El resultado de ungzip es un Unit8Array . Si desea volver a convertirlo en una cadena, deberá decodificarlo nuevamente:
const unzippedString = new TextDecoder('utf8').decode(unzipped);El "H4sIAAAAAAAA//NIzcnJVyguSUzOzi9LLUrLyS/XUSjJSMzLLlZIyy9SSMwpT6wsVshIzSnIzEtXBACs78K6LwAAAA==" es una cadena codificada en base64, primero debe decodificarla en un búfer.
textEncoder.encode simplemente codifica esa cadena codificada en base64 en un flujo de bytes.
Cómo hacerlo depende de si está en un navegador o en nodejs.
Para convertir los datos descomprimidos en una cadena, debe usar new TextDecoder().decode()
Para el nodo, utilizará Buffer.from(string, 'base64') para decodificar la cadena codificada en 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)); En el navegador, debe usar atob y debe convertir los datos decodificados en un Uint8Array usando, por ejemplo Uint8Array.from .
La conversión que utilicé se tomó de Convert base64 string a ArrayBuffer , es posible que deba verificar si eso realmente funciona en todos los casos.
// 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>