我们如何区分deflateRawstream的deflatestream?

一些HTTP服务器发送deflate原始主体(没有zlib头)而不是实际的deflate主体。 请参阅以下讨论: 为什么真实世界的服务器更喜欢gzip而不是deflate编码?

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

       

网上收集的解决方案 "我们如何区分deflateRawstream的deflatestream?"

如果hex中的第一个字节的低位字节为8 ,那么它是一个zlibstream。 否则,这是一个原始的缩小stream。 (假设你已经知道唯一可能的select是一个有效的zlibstream或一个有效的deflatestream)。一个原始的deflatestream将永远不会有一个8低的第一个低位,但一个zlibstream总是会的。

背景:

zlib头格式将压缩方法放在第一个字节的低位。 压缩方法总是8放气。

原始deflatestream中的位序列从字节的最低有效位开始。 如果前三位是000 (因为它们是8 ),则表示存储的(不是压缩的块),而不是最后的块。 存储块将字节边界上的input字节。 因此,在写入000位后,压缩器完成的下一步是用零位填充剩余的字节,以达到下一个字节边界。 因此下一位永远不会是1 ,所以有效的deflatestream不可能有前四位为1000 ,或者第一个为8 。 (请注意,这些位是从下到上读取的。)

第一个(即低)有效的deflatestream只能是0..5或a .. d 。 如果您看到6 .. 9ef ,那么它不是一个有效的deflatestream。