【问题标题】:How is the gzip file size encoded?gzip 文件大小是如何编码的?
【发布时间】: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

Determine size of file in gzip

Gzip.org has more information about Gzip

【问题讨论】:

  • 请参阅this answer,了解为什么通常不应依赖该长度。
  • 同意。对于编码一次、具有一定大小(小于 2^32 字节)的单个文件,RFC 为您提供了提取最后 4 个字节以获取文件大小的方法。也许不完全通用,但仍然非常有用。

标签: c++ c encoding gzip


【解决方案1】:

RFC 说它是模 2^32,这意味着 uint32_t,而使用 .Net 的实验 GZipStream 将它作为 little-endian。

RFC 1952

【讨论】:

  • 我添加了 RFC 链接。
  • 您的实验结果在 RFC 1952 的第 2.1 节中得到确认:“此处描述的格式中的所有多字节数字都以最低有效字节在前(在较低的内存地址)存储。”
  • 正如您所指出的,RFC(第 2.1 节)将字节顺序指定为最低有效字节到最高有效字节。因此,ISIZE 4 字节的文件大小以 little-endian 存储(实验结果已经证实)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多