⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zinflate_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00464"></a>00464 <span class="keywordtype">bool</span> Inflator::DecodeBody()<a name="l00465"></a>00465 {<a name="l00466"></a>00466         <span class="keywordtype">bool</span> blockEnd = <span class="keyword">false</span>;<a name="l00467"></a>00467         <span class="keywordflow">switch</span> (m_blockType)<a name="l00468"></a>00468         {<a name="l00469"></a>00469         <span class="keywordflow">case</span> 0: <span class="comment">// stored</span><a name="l00470"></a>00470                 assert(m_reader.<a class="code" href="class_low_first_bit_reader.html#62533059d5572cf7dfc5bcb7d308bec6">BitsBuffered</a>() == 0);<a name="l00471"></a>00471                 <span class="keywordflow">while</span> (!<a class="code" href="class_inflator.html#e219ede9a3c7342d6c9262f87c8a571d">m_inQueue</a>.<a class="code" href="class_byte_queue.html#c218d4b07fe058306a00475222869aaa">IsEmpty</a>() &amp;&amp; !blockEnd)<a name="l00472"></a>00472                 {<a name="l00473"></a>00473                         <span class="keywordtype">size_t</span> size;<a name="l00474"></a>00474                         <span class="keyword">const</span> byte *block = <a class="code" href="class_inflator.html#e219ede9a3c7342d6c9262f87c8a571d">m_inQueue</a>.<a class="code" href="class_byte_queue.html#18f79d62aa125a795cf61444d1076cde">Spy</a>(size);<a name="l00475"></a>00475                         size = UnsignedMin(m_storedLen, size);<a name="l00476"></a>00476                         OutputString(block, size);<a name="l00477"></a>00477                         <a class="code" href="class_inflator.html#e219ede9a3c7342d6c9262f87c8a571d">m_inQueue</a>.<a class="code" href="class_buffered_transformation.html#0c25529ded99db20ad35ccef3f7234e6" title="discard skipMax bytes from the output buffer">Skip</a>(size);<a name="l00478"></a>00478                         m_storedLen -= (word16)size;<a name="l00479"></a>00479                         <span class="keywordflow">if</span> (m_storedLen == 0)<a name="l00480"></a>00480                                 blockEnd = <span class="keyword">true</span>;<a name="l00481"></a>00481                 }<a name="l00482"></a>00482                 <span class="keywordflow">break</span>;<a name="l00483"></a>00483         <span class="keywordflow">case</span> 1: <span class="comment">// fixed codes</span><a name="l00484"></a>00484         <span class="keywordflow">case</span> 2: <span class="comment">// dynamic codes</span><a name="l00485"></a>00485                 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthStarts[] = {<a name="l00486"></a>00486                         3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,<a name="l00487"></a>00487                         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258};<a name="l00488"></a>00488                 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthExtraBits[] = {<a name="l00489"></a>00489                         0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,<a name="l00490"></a>00490                         3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};<a name="l00491"></a>00491                 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceStarts[] = {<a name="l00492"></a>00492                         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,<a name="l00493"></a>00493                         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,<a name="l00494"></a>00494                         8193, 12289, 16385, 24577};<a name="l00495"></a>00495                 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceExtraBits[] = {<a name="l00496"></a>00496                         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,<a name="l00497"></a>00497                         7, 7, 8, 8, 9, 9, 10, 10, 11, 11,<a name="l00498"></a>00498                         12, 12, 13, 13};<a name="l00499"></a>00499 <a name="l00500"></a>00500                 <span class="keyword">const</span> <a class="code" href="class_huffman_decoder.html" title="Huffman Decoder.">HuffmanDecoder</a>&amp; literalDecoder = GetLiteralDecoder();<a name="l00501"></a>00501                 <span class="keyword">const</span> <a class="code" href="class_huffman_decoder.html" title="Huffman Decoder.">HuffmanDecoder</a>&amp; distanceDecoder = GetDistanceDecoder();<a name="l00502"></a>00502 <a name="l00503"></a>00503                 <span class="keywordflow">switch</span> (m_nextDecode)<a name="l00504"></a>00504                 {<a name="l00505"></a>00505                 <span class="keywordflow">case</span> LITERAL:<a name="l00506"></a>00506                         <span class="keywordflow">while</span> (<span class="keyword">true</span>)<a name="l00507"></a>00507                         {<a name="l00508"></a>00508                                 <span class="keywordflow">if</span> (!literalDecoder.<a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">Decode</a>(m_reader, m_literal))<a name="l00509"></a>00509                                 {<a name="l00510"></a>00510                                         m_nextDecode = LITERAL;<a name="l00511"></a>00511                                         <span class="keywordflow">break</span>;<a name="l00512"></a>00512                                 }<a name="l00513"></a>00513                                 <span class="keywordflow">if</span> (m_literal &lt; 256)<a name="l00514"></a>00514                                         OutputByte((byte)m_literal);<a name="l00515"></a>00515                                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_literal == 256)      <span class="comment">// end of block</span><a name="l00516"></a>00516                                 {<a name="l00517"></a>00517                                         blockEnd = <span class="keyword">true</span>;<a name="l00518"></a>00518                                         <span class="keywordflow">break</span>;<a name="l00519"></a>00519                                 }<a name="l00520"></a>00520                                 <span class="keywordflow">else</span><a name="l00521"></a>00521                                 {<a name="l00522"></a>00522                                         <span class="keywordflow">if</span> (m_literal &gt; 285)<a name="l00523"></a>00523                                                 <span class="keywordflow">throw</span> BadBlockErr();<a name="l00524"></a>00524                                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bits;<a name="l00525"></a>00525                 <span class="keywordflow">case</span> LENGTH_BITS:<a name="l00526"></a>00526                                         bits = lengthExtraBits[m_literal-257];<a name="l00527"></a>00527                                         <span class="keywordflow">if</span> (!m_reader.<a class="code" href="class_low_first_bit_reader.html#7c2250f093883488eefb6d498aa1c510">FillBuffer</a>(bits))<a name="l00528"></a>00528                                         {<a name="l00529"></a>00529                                                 m_nextDecode = LENGTH_BITS;<a name="l00530"></a>00530                                                 <span class="keywordflow">break</span>;<a name="l00531"></a>00531                                         }<a name="l00532"></a>00532                                         m_literal = m_reader.<a class="code" href="class_low_first_bit_reader.html#ecfd76bf8814829b75d9d4f6592a4625">GetBits</a>(bits) + lengthStarts[m_literal-257];<a name="l00533"></a>00533                 <span class="keywordflow">case</span> DISTANCE:<a name="l00534"></a>00534                                         <span class="keywordflow">if</span> (!distanceDecoder.<a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">Decode</a>(m_reader, m_distance))<a name="l00535"></a>00535                                         {<a name="l00536"></a>00536                                                 m_nextDecode = DISTANCE;<a name="l00537"></a>00537                                                 <span class="keywordflow">break</span>;<a name="l00538"></a>00538                                         }<a name="l00539"></a>00539                 <span class="keywordflow">case</span> DISTANCE_BITS:<a name="l00540"></a>00540                                         bits = distanceExtraBits[m_distance];<a name="l00541"></a>00541                                         <span class="keywordflow">if</span> (!m_reader.<a class="code" href="class_low_first_bit_reader.html#7c2250f093883488eefb6d498aa1c510">FillBuffer</a>(bits))<a name="l00542"></a>00542                                         {<a name="l00543"></a>00543                                                 m_nextDecode = DISTANCE_BITS;<a name="l00544"></a>00544                                                 <span class="keywordflow">break</span>;<a name="l00545"></a>00545                                         }<a name="l00546"></a>00546                                         m_distance = m_reader.<a class="code" href="class_low_first_bit_reader.html#ecfd76bf8814829b75d9d4f6592a4625">GetBits</a>(bits) + distanceStarts[m_distance];<a name="l00547"></a>00547                                         OutputPast(m_literal, m_distance);<a name="l00548"></a>00548                                 }<a name="l00549"></a>00549                         }<a name="l00550"></a>00550                 }<a name="l00551"></a>00551         }<a name="l00552"></a>00552         <span class="keywordflow">if</span> (blockEnd)<a name="l00553"></a>00553         {<a name="l00554"></a>00554                 <span class="keywordflow">if</span> (m_eof)<a name="l00555"></a>00555                 {<a name="l00556"></a>00556                         FlushOutput();<a name="l00557"></a>00557                         m_reader.<a class="code" href="class_low_first_bit_reader.html#7127a720aeefbc1d91dddefc694538c6">SkipBits</a>(m_reader.<a class="code" href="class_low_first_bit_reader.html#62533059d5572cf7dfc5bcb7d308bec6">BitsBuffered</a>()%8);<a name="l00558"></a>00558                         <span class="keywordflow">if</span> (m_reader.<a class="code" href="class_low_first_bit_reader.html#62533059d5572cf7dfc5bcb7d308bec6">BitsBuffered</a>())<a name="l00559"></a>00559                         {<a name="l00560"></a>00560                                 <span class="comment">// undo too much lookahead</span><a name="l00561"></a>00561                                 <a class="code" href="class_sec_block_with_hint.html" title="a SecBlock that preallocates size S statically, and uses the heap when this size...">SecBlockWithHint&lt;byte, 4&gt;</a> buffer(m_reader.<a class="code" href="class_low_first_bit_reader.html#62533059d5572cf7dfc5bcb7d308bec6">BitsBuffered</a>() / 8);<a name="l00562"></a>00562                                 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;buffer.size(); i++)<a name="l00563"></a>00563                                         buffer[i] = (byte)m_reader.<a class="code" href="class_low_first_bit_reader.html#ecfd76bf8814829b75d9d4f6592a4625">GetBits</a>(8);<a name="l00564"></a>00564                                 <a class="code" href="class_inflator.html#e219ede9a3c7342d6c9262f87c8a571d">m_inQueue</a>.<a class="code" href="class_byte_queue.html#bdc94324169d07db16a246259c5ef86b">Unget</a>(buffer, buffer.size());<a name="l00565"></a>00565                         }<a name="l00566"></a>00566                         m_state = POST_STREAM;<a name="l00567"></a>00567                 }<a name="l00568"></a>00568                 <span class="keywordflow">else</span><a name="l00569"></a>00569                         m_state = WAIT_HEADER;<a name="l00570"></a>00570         }<a name="l00571"></a>00571         <span class="keywordflow">return</span> blockEnd;<a name="l00572"></a>00572 }<a name="l00573"></a>00573 <a name="l00574"></a>00574 <span class="keywordtype">void</span> Inflator::FlushOutput()<a name="l00575"></a>00575 {<a name="l00576"></a>00576         <span class="keywordflow">if</span> (m_state != PRE_STREAM)<a name="l00577"></a>00577         {<a name="l00578"></a>00578                 assert(m_current &gt;= m_lastFlush);<a name="l00579"></a>00579                 ProcessDecompressedData(m_window + m_lastFlush, m_current - m_lastFlush);<a name="l00580"></a>00580                 m_lastFlush = m_current;<a name="l00581"></a>00581         }<a name="l00582"></a>00582 }<a name="l00583"></a>00583 <a name="l00584"></a><a class="code" href="struct_new_fixed_liter

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -