Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Delphi进行GZip流压缩(可选使用tar)_Delphi_Stream_Gzip_Zlib_Deflate - Fatal编程技术网

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

使用Delphi进行GZip流压缩(可选使用tar),delphi,stream,gzip,zlib,deflate,Delphi,Stream,Gzip,Zlib,Deflate,我在Delphi10中使用streams搜索并搜索了几个小时,以创建一个有效的.tar.gz文件 我能够使用解决tarball部分,效果很好 经过一些搜索,我还找到了一些示例,可以使用System.ZLib解压gzip数据。秘密在于WindowBits参数: //31位宽窗口=仅限gzip模式 decompostream:=TZDecompressionStream.Create(SourceStream,15+16); TarStream:=ttarachive.Create(decompos

我在Delphi10中使用streams搜索并搜索了几个小时,以创建一个有效的.tar.gz文件

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

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

//31位宽窗口=仅限gzip模式
decompostream:=TZDecompressionStream.Create(SourceStream,15+16);
TarStream:=ttarachive.Create(decompostream);
TarStream.Reset;
而TarStream.FindNext(DirRec)do{…}TarStream.ReadFile(TargetStream);
太好了!但是,
System.ZLib
真的有可能解压gzip(我猜只是通过+16忽略gzip头?),但不能自己创建这样的头吗?无论我尝试什么,我只得到一个7zip或WinRar无法打开的文件,因为缺少头

也许它就是不能工作,因为gzip头包含校验和,所以在不知道以下数据的情况下不可能写入头。如何解决这个问题?编辑:这是错误的,请参阅注释:crc32在拖车中


看起来,许多其他人也有这个问题-我找到并尝试了多种解决方案来添加这个标题,但没有什么真正起作用,所有的事情都需要添加长单位(不是很好,但可以接受),甚至DLL(我不可以接受)

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

信不信由你,压缩到gzip的方式也一样!我在谷歌的任何地方都找不到这个,或者在Embarcadero文档/帮助中也找不到。但请查看Delphi Tokyo的
System.ZLib
源代码中的这条评论:

向windowBits添加16以写入简单的gzip头和 压缩数据的拖车,而不是zlib包装器。这个 gzip头将没有文件名,没有额外数据,没有注释,没有 修改时间(设置为零)、无标头crc和操作 系统将设置为255(未知)

它的工作原理是:

TargetStream:=TFileStream.Create(TargetFilename,fmCreate);
CompressStream:=TZCompressStream.Create(TargetStream,zcDefault,15+16);
TarStream:=TTarWriter.Create(CompressStream);
AddStream(SourceStream1,SourceFilename1,现在);
AddString(SourceString2,SourceFilename2,现在);

>你告诉我(至少如果感觉到-我只能猜测),我可以知道用Delphi来压缩GZIP,通过使用ZLIB查找和读取一个关于解压的非Delphi问题,第二个答案用“Python”命名,它只提到文本中间某个小“(de)”的压缩,这让我的问题和答案过时了?是的,都在那里,某个地方。但对我来说,这真的很难找到,所以我希望我的问题和答案现在能帮助别人。如果你在谷歌上搜索“delphi gzip压缩”,你会很有希望理解这个问题。不,我只是添加了一个指向另一个相关问题的链接,以便将这两个问题链接在一起。您可以在右侧看到链接主题列表。这是另一个与Delphi相关的例子。这个单元包含了Gzip格式的压缩/解压缩流的一个很好的实现:在Gzip格式中总是有一个CRC来验证文件的完整性。什么是没有一个单独的头CRC,只有10字节的头。没问题。啊,谢谢,@MarkAdler!嗯,但这意味着
TZCompressionStream
必须缓冲内存中的所有数据,因为它必须等待端点知道大小和crc以将其放入报头(只检查报头格式)。我没想到。好的,对于记录:我删除了我的“我认为没有校验和来验证文件完整性是不好的。”从答案中…不,gzip格式将大小和CRC放在预告片中,而不是头。这也是我的第一个逻辑结论,但我无法验证这一点-标题提到了预告片,但没有提到文本。所以我在别的地方找到了一些帖子,说预告片只是一个#0->10+1=11(错)但现在,感谢你们的帮助,我从这一章翻了一页,明白了:)谢谢你们的帮助和你们的工作。当您试图节省时间时,尤其是当您做出错误的假设时,例如认为windowBits可能是在解压缩时跳过未知标题的东西时,这一切都可能会产生误导。(续…)看起来内存中的gzip是在2003年添加到zlib1.2.1中的。