【发布时间】:2015-09-03 23:33:18
【问题描述】:
我正在尝试使用 PHP 来解析在 Delphi 中创建的自定义 gzip 存档文件格式(不是我的代码!)。格式基本上是:
4-byte integer: count of files in archive
for each compressed file:
4-byte integer: filename length [n]
[n] bytes: filename
4-byte integer: uncompressed file length [m]
[????] bytes: gzipped content
我可以读取文件并实际解码第一个压缩文件,方法是使用zlib_decode(),在我知道长度 ([m]) 后,文件其余部分的最大未压缩长度为 [m] 字节,但随后我被卡住了,因为我不知道应该在子字符串中走多远才能找到下一个文件名——zlib_decode() 没有返回它在停止之前处理的压缩字节数。由于这是一种自定义格式,我似乎无法使用普通的gzopen()/gzread() 函数,因为整个文件没有被压缩(我试过了,它不起作用)。
此代码在 Delphi 中有效,因为显然您可以在普通文件读取函数和 System.ZLib 解码函数之间来回传递文件句柄——您可以读取 [m] 个未压缩字节,并且指针将保持在最后一个压缩byte -- 但是 PHP 似乎不支持在 read-as-normal 和 read-as-gzip 之间切换。
我在 PHP 中是否缺少一种明显的方式来处理像这样的混合内容文件格式,元数据和压缩数据以这种方式堆叠在一起?还是我不知道压缩数据长度不走运?
【问题讨论】: