ale*_*nst -1 parsing gzip zlib deflate
我花了几天时间阅读 zlib(以及 gzip 和 deflate)RFC,我可以说它们有点垃圾。缺少一些细节,所以我打开这个问题。
我正在尝试解析 zlib 数据,我需要了解有关标头的一些详细信息。
首先,RFC 说会有 2 个字节,CMF并且FLG.
CMF分为 2 个 4 位部分。第一个是CM,第二个是CINFO。
的可能值是CM什么?RFC 说这8意味着deflate并且那15是保留的,但是其余的可能值呢?
CINFO 另一方面,如果我正确理解 RFC,应该总是 8(如果我错了,请纠正我)。
跳过FLG和可能的FDICT,我们进入该Compressed data部分。RFC的这一部分说:
For compression method 8, the compressed data is stored in the
deflate compressed data format as described in the document
"DEFLATE Compressed Data Format Specification" by L. Peter
Deutsch. (See reference [3] in Chapter 3, below)
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我应该假设它CM总是 8 吗?如果yes,那么为什么整个CM事物存在?
最后,我有点困惑。我一直相信 zlib 可以同时包装 deflate 和 gzip,但是阅读这个 RFC 我看不到 gzip 压缩数据适合这里的位置。有什么我想念的吗?
的可能值是
CM什么?RFC 说这8意味着deflate并且那15是保留的,但是其余的可能值呢?...
我应该假设它
CM总是 8 吗?如果yes,那么为什么整个CM事物存在?
CM 是否有供将来使用并允许其他(非标准)压缩方法:
此版本的 zlib 规范中未指定其他压缩数据格式。(RFC 1950,“ZLIB 压缩数据格式规范 3.3 版”)
你不应该假设它总是 8。相反,你应该检查它,如果它不是 8,则抛出“不支持”错误。
CINFO另一方面,如果我正确理解 RFC,应该总是 8(如果我错了,请纠正我)。
不, 的含义CINFO取决于CM。如果CM是 8(唯一有意义的标准化值),则:
CINFO是 LZ77 窗口大小的以 2 为底的对数,减去 8(CINFO=7表示 32K 窗口大小)。CINFO此版本的规范中不允许超过 7 的值。(RFC 1950,“ZLIB 压缩数据格式规范 3.3 版”)
所以实际上CINFO 不可能是8。
跳过
FLG和可能的FDICT,我们进入该Compressed data部分。RFC的这一部分说:Run Code Online (Sandbox Code Playgroud)For compression method 8, the compressed data is stored in the deflate compressed data format as described in the document "DEFLATE Compressed Data Format Specification" by L. Peter Deutsch. (See reference [3] in Chapter 3, below)这是什么意思?
这意味着 DEFLATE 编码的细节没有在本标准中指定,而是在别处描述,在ftp://ftp.uu.net/pub/archiving/zip/zlib/。
如果您愿意,DEFLATE 有自己的 RFC,即RFC 1951, "DEFLATE Compressed Data Format Specification version 1.3"。
最后,我有点困惑。我一直相信 zlib 可以同时包装 deflate 和 gzip,但是阅读这个 RFC 我看不到 gzip 压缩数据适合这里的位置。有什么我想念的吗?
不,zlib 不能包装 gzip。gzip 和 zlib 是 deflate 数据的不同包装器(zip 格式、PNG 格式、PDF 格式等)
Gzip 使用 DEFLATE:
该格式目前使用 DEFLATE 压缩方法,但可以轻松扩展以使用其他压缩方法。(RFC 1952,“GZIP 文件格式规范版本 4.3”)
CM = 8表示窗口大小高达 32K 的“deflate”压缩方法。这是 gzip 和 PNG 使用的方法(RFC 1950,“ZLIB 压缩数据格式规范版本 3.3”)
如果您发现 RFC 不清楚或难以理解,请考虑查看 zlib 实现的源代码。虽然有些实现可能是非标准的,但查看源代码可能会帮助您解决一些疑问。
以下是来自 zlib.net的zlib源代码的摘录,它回答了您的一个问题:
#define Z_DEFLATED 8
/* ... */
if (BITS(4) != Z_DEFLATED) {
strm->msg = (char *)"unknown compression method";
state->mode = BAD;
break;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1556 次 |
| 最近记录: |