【发布时间】:2023-03-14 09:50:02
【问题描述】:
gzip 文件格式包含在压缩文件的最后 4 个字节中编码的(未压缩/原始)文件大小。 “gzip -l”命令报告压缩和未压缩的大小、压缩比、原始文件名。
查看stackoverflow,有几处提到解码最后4个字节编码的大小。
尺寸的编码是什么? Big-endian(最高有效字节在前),Little-endian(最低有效字节在前),值是有符号还是无符号?
这段代码 sn-p 似乎对我有用,
FILE* fh; //assume file handle opened
unsigned char szbuf[4];
struct stat statbuf;
fstat(fn,&statbuf);
unsigned long clen=statbuf.st_size;
fseek(fh,clen-4,SEEK_SET);
int count=fread(szbuf,1,4,fh);
unsigned long ulen = ((((((szbuf[4-1] << 8) | szbuf[3-1]) << 8) | szbuf[2-1]) << 8) | szbuf[1-1]);
这里有一些相关的帖子,它们似乎暗示着小端和无符号长 (0..4GB-1)。
Determine uncompressed size of GZIP file
GZIPOutputStream not updating Gzip size bytes
【问题讨论】:
-
请参阅this answer,了解为什么通常不应依赖该长度。
-
同意。对于编码一次、具有一定大小(小于 2^32 字节)的单个文件,RFC 为您提供了提取最后 4 个字节以获取文件大小的方法。也许不完全通用,但仍然非常有用。