gzip文件大小是如何编码的?

3
gzip文件格式包含压缩文件的(未压缩/原始)大小,编码在压缩文件的最后4个字节中。"gzip -l"命令报告压缩和未压缩大小、压缩比率以及原始文件名。
在stackoverflow上查找时,提到了一些解码最后4个字节大小的方法。
大小的编码方式是什么?大端序(最高位字节先)、小端序(最低位字节先),以及值是有符号的还是无符号的?
这段代码片段似乎对我有效。
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)。

确定GZIP文件的未压缩大小

GZIPOutputStream不更新Gzip大小字节

确定gzip文件的大小

Gzip.org提供有关Gzip的更多信息


请参考此答案,了解为什么通常不应该依赖于该长度。 - Mark Adler
同意。对于只编码一次、大小在2^32字节以下的单个文件,RFC给出了获取文件大小的方法。也许不是完全通用的,但仍然非常有用。 - ChuckCottrill
1个回答

6
RFC规定使用模2^32来计算,即使用uint32_t,通过使用.Net的GZipStream进行实验可以得出结果是小端字节序。
参考链接:RFC 1952

我添加了RFC链接。 - Medinoc
2
你的实验结果在RFC 1952的2.1节中得到了确认:“这里描述的所有多字节数字都以最低有效字节优先(存储在较低的内存地址)的格式存储。” - indiv
正如您所指出的,RFC(第2.1节)将字节顺序指定为从最不重要的字节到最重要的字节。因此,ISIZE 4字节文件大小以小端方式存储(正如实验结果已经证实的那样)。 - ChuckCottrill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接