我们如何区分deflateRawstream的deflatestream?
一些HTTP服务器发送deflate原始主体(没有zlib头)而不是实际的deflate主体。 请参阅以下讨论: 为什么真实世界的服务器更喜欢gzip而不是deflate编码?
是否有可能检测到它们并在Node.js中正确处理膨胀? 我的意思是除了尝试createInflate
他们并捕获错误,然后再次尝试createInflateRaw
。
如果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
.. 9
, e
或f
,那么它不是一个有效的deflatestream。