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

📄 zdeflate_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 4 页
字号:
00558                                                                          <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *end, 00559                                                                          <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *&amp; p, 00560                                                                          <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;extraBits, 00561                                                                          <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;extraBitsLength)00562 {00563         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> v = *p;00564         <span class="keywordflow">if</span> ((end-p) &gt;= 3)00565         {00566                 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *oldp = p;00567                 <span class="keywordflow">if</span> (v==0 &amp;&amp; p[1]==0 &amp;&amp; p[2]==0)00568                 {00569                         <span class="keywordflow">for</span> (p=p+3; p!=end &amp;&amp; *p==0 &amp;&amp; p!=oldp+138; p++) {}00570                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> repeat = p - oldp;00571                         <span class="keywordflow">if</span> (repeat &lt;= 10)00572                         {00573                                 extraBits = repeat-3;00574                                 extraBitsLength = 3;00575                                 <span class="keywordflow">return</span> 17;00576                         }00577                         <span class="keywordflow">else</span>00578                         {00579                                 extraBits = repeat-11;00580                                 extraBitsLength = 7;00581                                 <span class="keywordflow">return</span> 18;00582                         }00583                 }00584                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (p!=begin &amp;&amp; v==p[-1] &amp;&amp; v==p[1] &amp;&amp; v==p[2])00585                 {00586                         <span class="keywordflow">for</span> (p=p+3; p!=end &amp;&amp; *p==v &amp;&amp; p!=oldp+6; p++) {}00587                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> repeat = p - oldp;00588                         extraBits = repeat-3;00589                         extraBitsLength = 2;00590                         <span class="keywordflow">return</span> 16;00591                 }00592         }00593         p++;00594         extraBits = 0;00595         extraBitsLength = 0;00596         <span class="keywordflow">return</span> v;00597 }00598 00599 <span class="keywordtype">void</span> Deflator::EncodeBlock(<span class="keywordtype">bool</span> eof, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockType)00600 {00601         PutBits(eof, 1);00602         PutBits(blockType, 2);00603 00604         <span class="keywordflow">if</span> (blockType == STORED)00605         {00606                 assert(m_blockStart + m_blockLength &lt;= m_byteBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00607                 FlushBitBuffer();00608                 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_2">PutWord16</a>(m_blockLength, LITTLE_ENDIAN_ORDER);00609                 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_2">PutWord16</a>(~m_blockLength, LITTLE_ENDIAN_ORDER);00610                 <a class="code" href="class_filter.html#_zlib_decompressora8">AttachedTransformation</a>()-&gt;<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(m_byteBuffer + m_blockStart, m_blockLength);00611         }00612         <span class="keywordflow">else</span>00613         {00614                 <span class="keywordflow">if</span> (blockType == DYNAMIC)00615                 {00616 <span class="preprocessor">#if defined(_MSC_VER) &amp;&amp; !defined(__MWERKS__)</span>00617 <span class="preprocessor"></span>                        <span class="comment">// VC60 workaround: built-in reverse_iterator has two template parameters, Dinkumware only has one</span>00618                         <span class="keyword">typedef</span> reverse_bidirectional_iterator&lt;unsigned int *, unsigned int&gt; RevIt;00619 <span class="preprocessor">#else</span>00620 <span class="preprocessor"></span>                        <span class="keyword">typedef</span> reverse_iterator&lt;unsigned int *&gt; RevIt;00621 <span class="preprocessor">#endif</span>00622 <span class="preprocessor"></span>00623                         FixedSizeSecBlock&lt;unsigned int, 286&gt; literalCodeLengths;00624                         FixedSizeSecBlock&lt;unsigned int, 30&gt; distanceCodeLengths;00625 00626                         m_literalCounts[256] = 1;00627                         HuffmanEncoder::GenerateCodeLengths(literalCodeLengths, 15, m_literalCounts, 286);00628                         m_dynamicLiteralEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera2">Initialize</a>(literalCodeLengths, 286);00629                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hlit = find_if(RevIt(literalCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>()), RevIt(literalCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+257), bind2nd(not_equal_to&lt;unsigned int&gt;(), 0)).base() - (literalCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+257);00630 00631                         HuffmanEncoder::GenerateCodeLengths(distanceCodeLengths, 15, m_distanceCounts, 30);00632                         m_dynamicDistanceEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera2">Initialize</a>(distanceCodeLengths, 30);00633                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hdist = find_if(RevIt(distanceCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>()), RevIt(distanceCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+1), bind2nd(not_equal_to&lt;unsigned int&gt;(), 0)).base() - (distanceCodeLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>()+1);00634 00635                         SecBlockWithHint&lt;unsigned int, 286+30&gt; combinedLengths(hlit+257+hdist+1);00636                         memcpy(combinedLengths, literalCodeLengths, (hlit+257)*<span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>));00637                         memcpy(combinedLengths+hlit+257, distanceCodeLengths, (hdist+1)*<span class="keyword">sizeof</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>));00638 00639                         FixedSizeSecBlock&lt;unsigned int, 19&gt; codeLengthCodeCounts, codeLengthCodeLengths;00640                         fill(codeLengthCodeCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), codeLengthCodeCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>(), 0);00641                         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *p = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), *begin = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), *end = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>();00642                         <span class="keywordflow">while</span> (p != end)00643                         {00644                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> code, extraBits, extraBitsLength;00645                                 code = CodeLengthEncode(begin, end, p, extraBits, extraBitsLength);00646                                 codeLengthCodeCounts[code]++;00647                         }00648                         HuffmanEncoder::GenerateCodeLengths(codeLengthCodeLengths, 7, codeLengthCodeCounts, 19);00649                         <a class="code" href="class_huffman_encoder.html">HuffmanEncoder</a> codeLengthEncoder(codeLengthCodeLengths, 19);00650                         <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> border[] = {    <span class="comment">// Order of the bit length code lengths</span>00651                                 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};00652                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hclen = 19;00653                         <span class="keywordflow">while</span> (hclen &gt; 4 &amp;&amp; codeLengthCodeLengths[border[hclen-1]] == 0)00654                                 hclen--;00655                         hclen -= 4;00656 00657                         PutBits(hlit, 5);00658                         PutBits(hdist, 5);00659                         PutBits(hclen, 4);00660 00661                         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;hclen+4; i++)00662                                 PutBits(codeLengthCodeLengths[border[i]], 3);00663 00664                         p = combinedLengths.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>();00665                         <span class="keywordflow">while</span> (p != end)00666                         {00667                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> code, extraBits, extraBitsLength;00668                                 code = CodeLengthEncode(begin, end, p, extraBits, extraBitsLength);00669                                 codeLengthEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, code);00670                                 PutBits(extraBits, extraBitsLength);00671                         }00672                 }00673 00674                 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthExtraBits[] = {00675                         0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,00676                         3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};00677                 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceExtraBits[] = {00678                         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,00679                         7, 7, 8, 8, 9, 9, 10, 10, 11, 11,00680                         12, 12, 13, 13};00681 00682                 <span class="keyword">const</span> <a class="code" href="class_huffman_encoder.html">HuffmanEncoder</a> &amp;literalEncoder = (blockType == STATIC) ? m_staticLiteralEncoder : m_dynamicLiteralEncoder;00683                 <span class="keyword">const</span> <a class="code" href="class_huffman_encoder.html">HuffmanEncoder</a> &amp;distanceEncoder = (blockType == STATIC) ? m_staticDistanceEncoder : m_dynamicDistanceEncoder;00684 00685                 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;m_matchBufferEnd; i++)00686                 {00687                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> literalCode = m_matchBuffer[i].literalCode;00688                         literalEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, literalCode);00689                         <span class="keywordflow">if</span> (literalCode &gt;= 257)00690                         {00691                                 assert(literalCode &lt;= 285);00692                                 PutBits(m_matchBuffer[i].literalExtra, lengthExtraBits[literalCode-257]);00693                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceCode = m_matchBuffer[i].distanceCode;00694                                 distanceEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, distanceCode);00695                                 PutBits(m_matchBuffer[i].distanceExtra, distanceExtraBits[distanceCode]);00696                         }00697                 }00698                 literalEncoder.<a class="code" href="class_huffman_encoder.html#_huffman_encodera3">Encode</a>(*<span class="keyword">this</span>, 256);      <span class="comment">// end of block</span>00699         }00700 }00701 00702 <span class="keywordtype">void</span> Deflator::EndBlock(<span class="keywordtype">bool</span> eof)00703 {00704         <span class="keywordflow">if</span> (m_matchBufferEnd == 0 &amp;&amp; !eof)00705                 <span class="keywordflow">return</span>;00706 00707         <span class="keywordflow">if</span> (m_deflateLevel == 0)00708                 EncodeBlock(eof, STORED);00709         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_blockLength &lt; 128)00710                 EncodeBlock(eof, STATIC);00711         <span class="keywordflow">else</span>00712         {00713                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> storedLen = 8*(m_blockLength+4) + RoundUpToMultipleOf(m_bitsBuffered+3, 8U)-m_bitsBuffered;00714                 StartCounting();00715                 EncodeBlock(eof, STATIC);00716                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> staticLen = FinishCounting();00717                 StartCounting();00718                 EncodeBlock(eof, DYNAMIC);00719                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> dynamicLen = FinishCounting();00720 00721                 <span class="keywordflow">if</span> (storedLen &lt;= staticLen &amp;&amp; storedLen &lt;= dynamicLen)00722                         EncodeBlock(eof, STORED);00723                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (staticLen &lt;= dynamicLen)00724                         EncodeBlock(eof, STATIC);00725                 <span class="keywordflow">else</span>00726                         EncodeBlock(eof, DYNAMIC);00727         }00728 00729         m_matchBufferEnd = 0;00730         m_blockStart += m_blockLength;00731         m_blockLength = 0;00732         fill(m_literalCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), m_literalCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>(), 0);00733         fill(m_distanceCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), m_distanceCounts.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>(), 0);00734 }00735 00736 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:28 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>

⌨️ 快捷键说明

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