mirror of
https://github.com/SabreTools/SabreTools.IO.git
synced 2026-11-15 16:41:58 +00:00
* Decode short codes at the end of the inflate input InflateCodes waited for as many bits as its lookup table uses before it decoded a literal, length or distance code. When the input ended with fewer bits than that, the last codes were not decoded, even though they were complete. An MS-ZIP block is a deflate stream on its own, so its last match was lost and the block came out short (#1). When no more input is there, the code is now looked up with the bits that are left and used if it is not longer than those. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep a full 32 KiB inflate dictionary SetDictionary kept only the last 32767 bytes of a 32 KiB dictionary, because the window needs one free byte between its read and write positions. MS-ZIP sets the previous 32 KiB block as the dictionary, and a match at the start of a block can copy from 32768 bytes back, which then read a byte that was not in the window. A dictionary that fills the window now starts with the read and write positions at 0, so the first byte written replaces the oldest byte of the dictionary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>