Estoy tratando de descomprimir una matriz de bytes en JavaScript con lz4 . Traté de implementar el ejemplo en la página npmjs. Ya tengo los datos en formato comprimido, por lo que volver a comprimirlos genera resultados no deseados. Yo he tratado:
var input = Buffer.from(this.bytes); var output = Buffer.alloc( lz4.encodeBound(input.length) ); var uncompressed = Buffer.alloc(input.length); var uncompressedSize = lz4.decodeBlock(output, uncompressed); uncompressed = uncompressed.slice(0, uncompressedSize); console.log( "uncompressed data", uncompressed); Lo que conduce a una matriz de 0. He confirmado que los datos que paso (this.bytes) son una matriz válida de bytes. Ej: [f1,09,01,54,00,00,00,00,46,00,00,00,53,07,00,00,00,6f,66,66,73,65,74,58,4e,00,01,00,f1,35,2a,c0,53,08,00,00,00,69,74,65,6d,49,63,6f,6e,53,1f,00,00,00,57,65,61,70,6f,6e,45,6e,63,68,61,6e,74,6d,65,6e,74,5f,53,70,65,61,72,30,32,5f,4c,61,72,67,65,53,0b,00,00,00,53,63,72,65,65,6e,57,69,64,74,68,4e,49,00,55,00,9e,40,53,06,5f,00,01,73,00,f1,04,02,00,00,00,53,01,00]
Agradecería cualquier ayuda o sugerencia.
Editar: he intentado decodificar directamente la matriz de bytes:
console.log(LZ4.decode(this.bytes.join("")));Esto lleva a este error:
Uncaught (in promise) Error: Invalid magic number: 39303166 @0 emit_Error http://localhost:8080/javascripts/lz4.min.js:8 read_MagicNumber http://localhost:8080/javascripts/lz4.min.js:8 _main http://localhost:8080/javascripts/lz4.min.js:8 _transform http://localhost:8080/javascripts/lz4.min.js:8 _read http://localhost:8080/javascripts/lz4.min.js:8 _write http://localhost:8080/javascripts/lz4.min.js:8 b http://localhost:8080/javascripts/lz4.min.js:8 s http://localhost:8080/javascripts/lz4.min.js:8 write http://localhost:8080/javascripts/lz4.min.js:8 end http://localhost:8080/javascripts/lz4.min.js:8 LZ4_uncompress http://localhost:8080/javascripts/lz4.min.js:8 construct http://localhost:8080/javascripts/readSaveFile.js:194 Al investigar este problema, me encontré con este problema. No pude encontrar la función lz4.createDecoderStream.prototype.uncompressBlock Luego probé un ejemplo del repositorio node-lz4 github:
var compressed = Buffer.from(this.lua_state); var uncompressedBlock = Buffer.alloc(compressed.length*10); var n = LZ4.decodeBlock(compressed, uncompressedBlock); uncompressedBlock = uncompressedBlock.slice(0,n); console.log(uncompressedBlock);Lo que devuelve, lo adivinaste, una matriz de 0. Estoy completamente atascado en este momento y nuevamente agradezco cualquier ayuda.
El problema era que mi matriz de entrada no era una matriz de enteros, así que la convertí en una UInt8Array con esta función:
function convert_byte_array_to_int_array(array) { let output_array = []; array.forEach(byte => { output_array.push(parseInt(byte, 16)); }); return output_array; }Y lo usé en el ejemplo del paquete así:
var input = convert_byte_array_to_int_array(this.bytes); console.log(input); var uncompressed = Buffer.alloc(input.length); var uncompressedSize = LZ4.decodeBlock(input, uncompressed); uncompressed = uncompressed.slice(0, uncompressedSize); console.log( "uncompressed data", uncompressed );Los datos sin comprimir que se enviaron a la consola eran los datos que estaba buscando. Gracias por tu ayuda.