"Convert" zlib 流到 gzip?
"Convert" zlib stream to gzip?
我有一个用 zlib 压缩的数据块,现在我需要解压缩它,但手头只有 Linux 环境中的 gzip。不幸的是,不可能获得任何其他工具。有什么方法可以将 zlib 数据“转换”为 gzip 可以解压缩的数据吗?
我读了这个:https://unix.stackexchange.com/questions/22834/how-to-uncompress-zlib-data-in-unix
基本上说是添加 10 个字节 header 并将其传递到 gzip 中。但是,当我尝试这个时,我没有得到任何输出。输出文件为空。
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00" |cat - /tmp/data |gzip -dc >/tmp/out
/tmp/data 包含以这两个字节开头的数据块:\x78\xDA(我将其解释为 zlib header)。
有什么建议吗?我也尝试在添加 gzip header.
之前删除这 2 个字节
编辑:
经过更多思考和阅读此处的评论后,我意识到输入数据实际上是不正确的。使用另一个来源的测试数据我得到了更进一步。见下文,编码为 base64,因为我无法附加二进制数据。
我有源数据:
eJwNzbEvA1EcwPEcgsUs6UIisZ17v7tre2ehaR+Kq/TaU0XEvddTd9yrtq8NFiQ1GGwisWnSQQSJwWoSJgMWxGBCYvEPEB2/y+f7WIvWhf5629jWXE/ShJ/erNDVEEgMtwXIydZ9e2DxbtLQhda60LCrO6eEuuuSZSYGrelofBBBDEvxWZAVNRiRZMBofCYWtpLZEI5OGkomHc6O9GmEFpoeybEWkuOejGQQkSoiIG6ZmwXilHjvRIEui3FW5i6vcOLb/pQ5KgJCSAHQVOKvrWJLAklGEgRRmJRzLYTnXU1FQUVHKESqax4A6IrarDDNFYgHeqj50ESQKbP9BllinlEpc6fk24yRPHNwyV2x6RLjnmGl0tg0IokEzTPuYDM+EaFVp+TAABpAM8Pjtcc9u/PrYdHJFK+f37vfAocdmxf5s5uUmJ73Lz86F/z93233c+P1++mlOPR369GrVqzvnh8dH95qB/QfS/18rQ==
然后我去掉前两个字节,得到这个:
Dc2xLwNRHMDxHILFLOlCIrGde7+7a3tnoWkfiqv02lNFxL3XU3fcq7avDRYkNRhsIrFp0kEEicFqEiYDFsRgQmLxDxAdv8vn+1iL1oX+etvY1lxP0oSf3qzQ1RBIDLcFyMnWfXtg8W7S0IXWutCwqzunhLrrkmUmBq3paHwQQQxL8VmQFTUYkWTAaHwmFraS2RCOThpKJh3OjvRphBaaHsmxFpLjnoxkEJEqIiBumZsF4pR470SBLotxVuYur3Di2/6UOSoCQkgB0FTir61iSwJJRhIEUZiUcy2E511NRUFFRyhEqmseAOiK2qwwzRWIB3qo+dBEkCmz/QZZYp5RKXOn5NuMkTxzcMldsekS455hpdLYNCKJBM0z7mAzPhGhVafkwAAaQDPD47XHPbvz62HRyRSvn9+73wKHHZsX+bOblJie9y8/Ohf8/d9t93Pj9fvppTj0d+vRq1as754fHR/eagf0H0v9fK0=
将其(以二进制形式,而不是 base64 - 只是为了清楚)写入文件:/tmp/inputdata 我 运行 以下 shell 命令:
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00" |cat - /tmp/inputdata| gzip -dc >/tmp/out
这给了我这个:
gzip: corrupted data
/tmp/out的内容(同样是base64编码):
0oRDoQEmoQRIf1sfUVIx8CBZAQ2kAWJERQQaYqh/zQYaYMdMTTkBA6EBpGF2gapiY2l4L1VSTjpVVkNJOjAxREUvSVoxMjM0NUEvMjFFMEpYRDdVUVk2RUNMTTNXVDdZRiM4YmNvYkRFYmRuAmJkdGoyMDIxLTA0LTAxYmlzdFJvYmVydCBLb2NoLUluc3RpdHV0Ym1hbU9SRy0xMDAwMzExODRibXBsRVUvMS8yMC8xNTA3YnNkAmJ0Z2k4NDA1MzkwMDZidnBqMTExOTM0OTAwN2Nkb2JqMTk2NC0wOC0xMmNuYW2kYmZuak11c3Rlcm1hbm5iZ25lRXJpa2FjZm50ak1VU1RFUk1BTk5jZ250ZUVSSUtBY3ZlcmUxLjAuMFhASoTSiWEI6NFgZVdxvtjgF9walgd6rmesxFMtVFxtseYIXm2N/YBp53na69PZcT/+xmpjtQNFOYWtmaCWxjiUYw==
你没看错。去掉前两个字节并添加这十个字节。然后 gzip -dc
会抱怨“文件意外结束”,但它仍然会解压缩并将结果写入输出文件。
除非 zlib 流一开始就损坏了。
我有一个用 zlib 压缩的数据块,现在我需要解压缩它,但手头只有 Linux 环境中的 gzip。不幸的是,不可能获得任何其他工具。有什么方法可以将 zlib 数据“转换”为 gzip 可以解压缩的数据吗?
我读了这个:https://unix.stackexchange.com/questions/22834/how-to-uncompress-zlib-data-in-unix
基本上说是添加 10 个字节 header 并将其传递到 gzip 中。但是,当我尝试这个时,我没有得到任何输出。输出文件为空。
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00" |cat - /tmp/data |gzip -dc >/tmp/out
/tmp/data 包含以这两个字节开头的数据块:\x78\xDA(我将其解释为 zlib header)。
有什么建议吗?我也尝试在添加 gzip header.
之前删除这 2 个字节编辑: 经过更多思考和阅读此处的评论后,我意识到输入数据实际上是不正确的。使用另一个来源的测试数据我得到了更进一步。见下文,编码为 base64,因为我无法附加二进制数据。
我有源数据:
eJwNzbEvA1EcwPEcgsUs6UIisZ17v7tre2ehaR+Kq/TaU0XEvddTd9yrtq8NFiQ1GGwisWnSQQSJwWoSJgMWxGBCYvEPEB2/y+f7WIvWhf5629jWXE/ShJ/erNDVEEgMtwXIydZ9e2DxbtLQhda60LCrO6eEuuuSZSYGrelofBBBDEvxWZAVNRiRZMBofCYWtpLZEI5OGkomHc6O9GmEFpoeybEWkuOejGQQkSoiIG6ZmwXilHjvRIEui3FW5i6vcOLb/pQ5KgJCSAHQVOKvrWJLAklGEgRRmJRzLYTnXU1FQUVHKESqax4A6IrarDDNFYgHeqj50ESQKbP9BllinlEpc6fk24yRPHNwyV2x6RLjnmGl0tg0IokEzTPuYDM+EaFVp+TAABpAM8Pjtcc9u/PrYdHJFK+f37vfAocdmxf5s5uUmJ73Lz86F/z93233c+P1++mlOPR369GrVqzvnh8dH95qB/QfS/18rQ==
然后我去掉前两个字节,得到这个:
Dc2xLwNRHMDxHILFLOlCIrGde7+7a3tnoWkfiqv02lNFxL3XU3fcq7avDRYkNRhsIrFp0kEEicFqEiYDFsRgQmLxDxAdv8vn+1iL1oX+etvY1lxP0oSf3qzQ1RBIDLcFyMnWfXtg8W7S0IXWutCwqzunhLrrkmUmBq3paHwQQQxL8VmQFTUYkWTAaHwmFraS2RCOThpKJh3OjvRphBaaHsmxFpLjnoxkEJEqIiBumZsF4pR470SBLotxVuYur3Di2/6UOSoCQkgB0FTir61iSwJJRhIEUZiUcy2E511NRUFFRyhEqmseAOiK2qwwzRWIB3qo+dBEkCmz/QZZYp5RKXOn5NuMkTxzcMldsekS455hpdLYNCKJBM0z7mAzPhGhVafkwAAaQDPD47XHPbvz62HRyRSvn9+73wKHHZsX+bOblJie9y8/Ohf8/d9t93Pj9fvppTj0d+vRq1as754fHR/eagf0H0v9fK0=
将其(以二进制形式,而不是 base64 - 只是为了清楚)写入文件:/tmp/inputdata 我 运行 以下 shell 命令:
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00" |cat - /tmp/inputdata| gzip -dc >/tmp/out
这给了我这个:
gzip: corrupted data
/tmp/out的内容(同样是base64编码):
0oRDoQEmoQRIf1sfUVIx8CBZAQ2kAWJERQQaYqh/zQYaYMdMTTkBA6EBpGF2gapiY2l4L1VSTjpVVkNJOjAxREUvSVoxMjM0NUEvMjFFMEpYRDdVUVk2RUNMTTNXVDdZRiM4YmNvYkRFYmRuAmJkdGoyMDIxLTA0LTAxYmlzdFJvYmVydCBLb2NoLUluc3RpdHV0Ym1hbU9SRy0xMDAwMzExODRibXBsRVUvMS8yMC8xNTA3YnNkAmJ0Z2k4NDA1MzkwMDZidnBqMTExOTM0OTAwN2Nkb2JqMTk2NC0wOC0xMmNuYW2kYmZuak11c3Rlcm1hbm5iZ25lRXJpa2FjZm50ak1VU1RFUk1BTk5jZ250ZUVSSUtBY3ZlcmUxLjAuMFhASoTSiWEI6NFgZVdxvtjgF9walgd6rmesxFMtVFxtseYIXm2N/YBp53na69PZcT/+xmpjtQNFOYWtmaCWxjiUYw==
你没看错。去掉前两个字节并添加这十个字节。然后 gzip -dc
会抱怨“文件意外结束”,但它仍然会解压缩并将结果写入输出文件。
除非 zlib 流一开始就损坏了。