我们如何区分 deflate 流和 deflateRaw 流?

How can we distinguish deflate stream from deflateRaw stream?

一些 HTTP 服务器发送 deflate raw body(没有 zlib headers)而不是实际的 deflate body。请参阅讨论:Why do real-world servers prefer gzip over deflate encoding?

是否可以在 Node.js 中检测到它们并正确处理膨胀?我的意思是除了尝试 createInflate 它们并捕获错误然后再次尝试 createInflateRaw

如果十六进制的第一个字节有一个低字节 8,那么它是一个 zlib 流。否则它是原始压缩流。 (假设您先验地知道唯一可能的选择是有效的 zlib 流或有效的 deflate 流。)原始 deflate 流永远不会在低第一个 nybble 中有 8,但 zlib 流总是会有。

背景:

zlib头格式把压缩方式放在第一个字节的低nybble。该压缩方法始终是 8 for deflate。

原始压缩流中的位序列从字节的最低有效位开始。如果前三位是 000(对于 8),则表示已存储(未压缩块),并且它不是最后一个块。存储块将输入的字节放在字节边界上。因此压缩器在写入 000 位后要做的下一件事是用零位填充字节的其余部分以到达下一个字节边界。因此,下一位永远不会是 1,因此对于有效的 deflate 流来说,前四位不可能是 1000,或者第一个 nybble 是 8。 (请注意,这些位是从下往上读取的。)

有效 deflate 流的第一个(即低)nybble 只能是 0..5a..d。如果您看到 6..9ef,则它不是有效的 deflate 流。