一些HTTP服務器發送deflate原始主體(沒有zlib頭文件)而不是真正的deflate主體。請參閱:Why do real-world servers prefer gzip over deflate encoding?我們如何區分deflateRaw流中的deflate流?
是否有可能檢測到它們並在Node.js中正確處理膨脹?我的意思是除了嘗試createInflate
他們和捕獲錯誤,然後再次嘗試createInflateRaw
。
一些HTTP服務器發送deflate原始主體(沒有zlib頭文件)而不是真正的deflate主體。請參閱:Why do real-world servers prefer gzip over deflate encoding?我們如何區分deflateRaw流中的deflate流?
是否有可能檢測到它們並在Node.js中正確處理膨脹?我的意思是除了嘗試createInflate
他們和捕獲錯誤,然後再次嘗試createInflateRaw
。
如果十六進制中的第一個字節的低位爲8
,那麼它是一個zlib流。否則,這是一個原始的縮小流。 (假設您已知道唯一可能的選擇是有效的zlib流或有效的deflate流)。原始deflate流永遠不會在低位第一個nybble中有8
,但zlib流總是會有。
背景:
ZLIB頭格式把壓縮方法中的第一個字節的低半字節。這種壓縮方法對於deflate而言總是爲8
。
原始減壓流中的位序列從字節的最低有效位開始。如果前三位是000
(因爲它們是8
),則表示存儲的(不是壓縮的塊),並且它不是最後的塊。存儲塊將字節邊界上的輸入字節。因此,在寫入000
位之後,壓縮器完成的下一步是用零位填充剩餘的字節以達到下一個字節邊界。因此,下一位永遠不會是1
,所以對於有效的deflate流來說前4位不可能是1000
,或者第一個nybble是8
。 (請注意,比特被從下往上讀取。)
有效放氣流的第一(即,低)半字節只能0
.. 5
或a
.. d
。如果您看到6
.. 9
,e
或f
,那麼它不是有效的放氣流。