使用Delphi进行GZip流压缩(可选择使用tar)

问题描述 投票:2回答:1

我在几个小时内搜索和搜索使用Delphi 10中的流创建有效的.tar.gz文件。

我能够使用LibTar解决tarball部分,效果很好。

经过一些搜索后,我还找到了使用System.ZLib解压缩gzip数据的例子。秘密在于WindowBits参数:

// 31 bit wide window = gzip only mode
DecompStream:= TZDecompressionStream.Create(SourceStream, 15 + 16);
TarStream:= TTarArchive.Create(DecompStream);
TarStream.Reset;
while TarStream.FindNext(DirRec) do {...} TarStream.ReadFile(TargetStream);

大!但是真的有可能System.ZLib能够解压缩gzip(我想只是忽略那个+ 16的gzip头?),但是它不能自己创建这样的头?无论我尝试什么,我只得到一个无法通过7zip或WinRar打开的文件,因为标题丢失了。

也许它只是无法工作,因为gzip头包含校验和,所以在不知道以下数据的情况下编写头是不可能的。怎么解决这个?编辑:这是错误的,请参阅注释:crc32在预告片中。

似乎,许多其他人也有这个问题 - 我发现并尝试了多个解决方案来添加这个标题,但没有真正起作用,一切都需要添加长单位(不好但可接受)甚至DLL(我不接受)。

delphi stream gzip zlib deflate
1个回答
1
投票

秘密在于WindowBits参数 - 听起来很熟悉? :)

信不信由你,压缩到gzip只是以同样的方式工作!我无法使用Google或Embarcadero文档/帮助在任何地方找到它。但请看看德尔福东京的System.ZLib来源中的这条评论:

向windowBits添加16,在压缩数据周围编写一个简单的gzip头和尾部,而不是zlib包装器。 gzip头文件没有文件名,没有额外数据,没有注释,没有修改时间(设置为零),没有头文件crc,操作系统将设置为255(未知)。

有用:

TargetStream:= TFileStream.Create(TargetFilename, fmCreate);
CompressStream:= TZCompressionStream.Create(TargetStream, zcDefault, 15 + 16);
TarStream:= TTarWriter.Create(CompressStream);
TarStream.AddStream(SourceStream1, SourceFilename1, Now);
TarStream.AddString(SourceString2, SourceFilename2, Now);
© www.soinside.com 2019 - 2024. All rights reserved.