为啥 7-zip 不解码 zlib.compress() 编码的内容?

Posted

技术标签:

【中文标题】为啥 7-zip 不解码 zlib.compress() 编码的内容?【英文标题】:Why does 7-zip not decode what is encoded by zlib.compress()?为什么 7-zip 不解码 zlib.compress() 编码的内容? 【发布时间】:2021-11-03 06:45:56 【问题描述】:

在下面的Python (3.10)程序testCompress.py中,作为测试输入,源代码本身被压缩应用zlib,并应在 Windows 10 上使用 7-zip (20.00 alpha) 解压缩。但它失败了。不接受压缩字节作为存档。输出在程序下方给出。

这是摘录。我真正的问题是,使用 Java java.util.zip.GZIPInputStreamZipInputStream解压缩 Python 压缩文件>。他们还证明字节不是存档。

from tempfile import gettempdir
from zlib import compress
from subprocess import run

filename=r"testCompress.py"
zipname = gettempdir() + r"\zipped.zip"
unzippedname = gettempdir() + r"\unzipped.txt"
unzip = r'"C:\Program Files\7-Zip\7z.exe" x ' + zipname

# zip using zlib

with open(filename,"r") as f:
    text = f.read()
b = bytes(text,"ascii")
bcompressed = compress(b)
with open(zipname,"wb") as f:
    f.write(bcompressed)
    f.close()

# unzip using 7-zip
print("now unzipping on cmd level", unzippedname)
run(unzip, shell=True)

导致输出:

PS C:\Users\ngong\python-workspace> & C:/Users/ngong/AppData/Local/Programs/Python/Python310/python.exe c:/Users/ngong/python-workspace/xslt/testCompress.py
unzipping C:\Users\NGONG\AppData\Local\Temp\unzipped.txt

7-Zip 20.00 alpha (x64) : Copyright (c) 1999-2020 Igor Pavlov : 2020-02-06

Scanning the drive for archives:
1 file, 9041 bytes (9 KiB)

Extracting archive: C:\Users\NGONG\AppData\Local\Temp\zipped.zip
ERROR: C:\Users\NGONG\AppData\Local\Temp\zipped.zip
C:\Users\NGONG\AppData\Local\Temp\zipped.zip
Open ERROR: Can not open the file as [zip] archive


ERRORS:
Is not archive

Can't open as archive: 1
Files: 0
Size:       0
Compressed: 0
PS C:\Users\ngong\python-workspace> 

【问题讨论】:

抱歉,这个问题问得太快了:我忽略了——显然——gzip 文件需要more 而不仅仅是压缩字节。我应该留下它还是删除它? *** 最好的习惯是什么? 如果您认为错误是其他人将来可能犯的错误,那么这仍然可以作为他们的有用参考。在这种情况下,您应该发布答案并在系统允许时接受(当您被允许接受自己的答案时会有更长的延迟;系统会让您等待 48 小时)。如果这真的只是一个错字(或 think-o),那么我们有一个密切的理由(***.com/help/on-topic 的#2)。如果您想在此基础上结束此问题,请在此处的评论中回复我,我可以为您完成。 @CodyGray 超级,谢谢!没有人是完美的,尤其是我。当我在 Python 中寻找压缩字符串时,我没有找到 gzip,而只是 zlib。这个错误很可能会在其他人身上重演。 见***.com/questions/20762094/… 【参考方案1】:

zlib.compress() 总是会产生一个 zlib 流。在 Java 方面,您显然会寻找 gzip 流或 zip 文件。这是三种不同的东西。

您可以在 Python 中使用 zlib.compressobj() 来生成 gzip 流。 (有关如何请求,请参阅文档。)

有关这三种格式的一些背景信息,请参阅 this answer。

【讨论】:

【参考方案2】:

通过 gzip 交换 Python 模块 zlib 不能解释错误,但可以作为一种解决方法。

from tempfile import gettempdir
import gzip
from subprocess import run

filename=r"testGzip.py"
zipname = gettempdir() + r"\zipped.gz"
unzippedname = gettempdir() + r"\unzipped.txt"
unzip = r'"C:\Program Files\7-Zip\7z.exe" x ' + zipname

# zip using zlib

with gzip.open(zipname,"wb") as gz:
    with open(filename,"r") as f:
        gz.write( bytes(f.read(), "utf-8") )
        gz.close()

# unzip using 7-zip
print("now unzipping on cmd level", unzippedname)
run(unzip, shell=True)

导致预期的输出:

PS C:\Users\ngong\python-workspace> & C:/Users/ngong/AppData/Local/Programs/Python/Python310/python.exe c:/Users/ngong/python-workspace/testGzip.py
now unzipping on cmd level C:\Users\NGONG\AppData\Local\Temp\unzipped.txt

7-Zip 20.00 alpha (x64) : Copyright (c) 1999-2020 Igor Pavlov : 2020-02-06

Scanning the drive for archives:
1 file, 305 bytes (1 KiB)

Extracting archive: C:\Users\NGONG\AppData\Local\Temp\zipped.gz
--
Path = C:\Users\NGONG\AppData\Local\Temp\zipped.gz
Type = gzip
Headers Size = 17

Everything is Ok

Size:       484
Compressed: 305

【讨论】:

感谢newbedev

以上是关于为啥 7-zip 不解码 zlib.compress() 编码的内容?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 apktool 不解码 versionCode 和 versionName?

为啥我不需要私钥来解码我的亚马逊 JWT?

不确定为啥我的服务器在帧解码器中收到“channelInterestChanged”事件

为啥7z的压缩率这么夸张

为啥 SKIA 不使用自定义 FilterInputStream?

为啥 UIImage 没有成功解码?