RFC 1952(GZIP 文件格式规范)第 2.3.1.1 节内容如下:
2.3.1.1. Extra field
If the FLG.FEXTRA bit is set, an "extra field" is present in
the header, with total length XLEN bytes. It consists of a
series of subfields, each of the form:
+---+---+---+---+==================================+
|SI1|SI2| LEN |... LEN bytes of subfield data ...|
+---+---+---+---+==================================+
SI1 and SI2 provide a subfield ID, typically two ASCII letters
with some mnemonic value. Jean-Loup Gailly
<email@hidden> is maintaining a registry of subfield
IDs; please send him any subfield ID you wish to use. Subfield
IDs with SI2 = 0 are reserved for future use. The following
IDs are currently defined:
SI1 SI2 Data
---------- ---------- ----
0x41 ('A') 0x70 ('P') Apollo file type information
LEN gives the length of the subfield data, excluding the 4
initial bytes.
除了 RFC 中给出的
AP
之外,是否还存在任何子字段类型?网络搜索找不到列表; GZip 的维基百科页面、GNU 主页、gzip 源代码或 Stack Overflow 上都没有提及。
据我所知,没有维护这样的注册表。 Jean-loup 不再适用于 gzip。
这里还有一个正在使用的子字段:
BGZF 格式(符合 gzip)是为生物信息学而开发的,使用子字段类型“BC”来指示当前块的大小。这用于使并行解压变得容易。
来自 http://samtools.github.io/hts-specs/SAMv1.pdf 的规范:
每个 BGZF 块都包含一个标准 gzip 文件头,具有以下符合标准的扩展名:
- 标头中的 F.EXTRA 位设置为指示存在额外字段。
- BGZF 使用的额外字段使用两个子字段 ID 值 66 和 67(ASCII ‘BC’)。
- BGZF额外字段有效负载(gzip规范中的字段LEN)的长度为2(两个字节 有效负载)。
- BGZF额外字段的有效负载是小端格式的16位无符号整数。这个整数 给出包含 BGZF 块的大小减一。
要记住两件事:
a) 某些 gzip 库甚至可能不会公开子字段。悲伤但真实。
b) 如果使用任何子字段,则生产应用程序可能与消费应用程序保持一致。因此,除非生成的 gzip 以某种方式暴露给意外的消费者,否则任意选择的子字段 ID 干扰消费应用程序行为的机会非常小(假设 62 个区分大小写的 alphanum ascii 中有 2 个字符,即 3844 个字符中的 1 个)。您不太可能在仅用于压缩的通用 gzip 流上看到任何子字段。
因此,如果您的目标是使用未注册 ID 的有目的的子字段来压缩我自己的文件,我会非常有信心。