我通过网络收到一个包含压缩xml文件的字节数组。我使用以下方法进行充气和放气。
let file = "./xmls/test.xml";
let arr = [120, 218, 188, 189, 121, 115, 219, 72, 150, 47, 250, 255, 251, 20, 169, 154, 59, 225, 174, 30];
//only took the first 20 bytes of this huge array for this example
zlib.inflate(Buffer.from(arr), (error, resultBuffer) => {
fs.writeFile(file, resultBuffer, () => {
console.log('done');
})
});
结果xml文件为280.458字节,没有任何非ascii(非法)字符 完成此操作后,我在新进程中调用以下代码
let file = "./xmls/test.xml";
fs.readFile(file, (readFileError, readFileBuffer) => {
zlib.deflate(readFileBuffer, (deflateError, deflateBuffer) => {
console.log(deflateBuffer);
// <Buffer 78 9c bc bd 69 73 db 48 96 36 fa fd fe 8a 54 cd 9d 70 77 bf ...
// 120 156 188 189 105 115 219 72 150 54 250 253 254 138 84 205 157 112 119 191
})
})
正如您所看到的,初始字节数组与缩小的输出不匹配
120 218 188 189 121 115 219 72 150 47 250 255 251 20 169 154 59 225 174 30
vs
120 156 188 189 105 115 219 72 150 54 250 253 254 138 84 205 157 112 119 191
我也尝试了基于流的方法,但它产生了相同的结果 如何在缩小xml文件后获取初始字节数组?
答案 0 :(得分:1)
您可能无法做到,但并不重要。通常,除非您使用相同的库,完全相同的库版本以及相同的压缩设置,否则您不应期望可以解压缩然后重新压缩到完全相同的内容。谁知道压缩数据来自何处,以及用于生成压缩数据的内容。
唯一的保证是,如果你压缩然后解压缩,那么你就得到了你的开始。这就是无损的意思,那就是你应该验证的东西。不需要重建相同的压缩数据流,因为通常许多压缩数据流可以产生相同的未压缩输出。根据所使用的算法和特定代码,以及用户请求的执行时间和压缩比之间的平衡,压缩器可以找到一个好的压缩器。