gzip文件格式包含在压缩文件的最后4个字节中编码的(未压缩/原始)文件大小。 “gzip -l”命令报告压缩和未压缩的大小,压缩率和原始文件名。
查看stackoverflow,有几个提到解码最后4个字节中编码的大小。
大小的编码是多少? Big-endian(最重要的字节优先),Little-endian(最低有效字节优先),是值有符号还是无符号?
此代码段似乎对我有用,
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