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

📄 zdeflate_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 4 页
字号:
00370         <span class="keywordflow">while</span> (current &gt; limit &amp;&amp; --chainLength &gt; 0)00371         {00372                 <span class="keyword">const</span> byte *match = m_byteBuffer + current;00373                 assert(scan + bestLength &lt; m_byteBuffer + m_stringStart + m_lookahead);00374                 <span class="keywordflow">if</span> (scan[bestLength-1] == match[bestLength-1] &amp;&amp; scan[bestLength] == match[bestLength] &amp;&amp; scan[0] == match[0] &amp;&amp; scan[1] == match[1])00375                 {00376                         assert(scan[2] == match[2]);00377                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = std::mismatch(scan+3, scanEnd, match+3).first - scan;00378                         assert(len != bestLength);00379                         <span class="keywordflow">if</span> (len &gt; bestLength)00380                         {00381                                 bestLength = len;00382                                 bestMatch = current;00383                                 <span class="keywordflow">if</span> (len == (scanEnd - scan))00384                                         <span class="keywordflow">break</span>;00385                         }00386                 }00387                 current = m_prev[current &amp; DMASK];00388         }00389         <span class="keywordflow">return</span> (bestMatch &gt; 0) ? bestLength : 0;00390 }00391 00392 <span class="keyword">inline</span> <span class="keywordtype">void</span> Deflator::InsertString(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> start)00393 {00394         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hash = ComputeHash(m_byteBuffer + start);00395         m_prev[start &amp; DMASK] = m_head[hash];00396         m_head[hash] = start;00397 }00398 00399 <span class="keywordtype">void</span> Deflator::ProcessBuffer()00400 {00401         <span class="keywordflow">if</span> (!m_headerWritten)00402         {00403                 WritePrestreamHeader();00404                 m_headerWritten = <span class="keyword">true</span>;00405         }00406 00407         <span class="keywordflow">if</span> (m_deflateLevel == 0)00408         {00409                 <span class="keywordflow">while</span> (m_lookahead &gt; 0)00410                 {00411                         LiteralByte(m_byteBuffer[m_stringStart++]);00412                         m_lookahead--;00413                 }00414                 <span class="keywordflow">return</span>;00415         }00416 00417         <span class="keywordflow">while</span> (m_lookahead &gt; m_minLookahead)00418         {00419                 <span class="keywordflow">while</span> (m_dictionaryEnd &lt; m_stringStart &amp;&amp; m_dictionaryEnd+3 &lt;= m_stringStart+m_lookahead)00420                         InsertString(m_dictionaryEnd++);00421 00422                 <span class="keywordflow">if</span> (m_matchAvailable)00423                 {00424                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> matchPosition, matchLength;00425                         <span class="keywordtype">bool</span> usePreviousMatch;00426                         <span class="keywordflow">if</span> (m_previousLength &gt;= MAX_LAZYLENGTH)00427                                 usePreviousMatch = <span class="keyword">true</span>;00428                         <span class="keywordflow">else</span>00429                         {00430                                 matchLength = LongestMatch(matchPosition);00431                                 usePreviousMatch = (m_previousLength &gt; 0 &amp;&amp; matchLength == 0);00432                         }00433                         <span class="keywordflow">if</span> (usePreviousMatch)00434                         {00435                                 MatchFound(m_stringStart-1-m_previousMatch, m_previousLength);00436                                 m_stringStart += m_previousLength-1;00437                                 m_lookahead -= m_previousLength-1;00438                                 m_matchAvailable = <span class="keyword">false</span>;00439                                 m_previousLength = 0;00440                         }00441                         <span class="keywordflow">else</span>00442                         {00443                                 m_previousLength = matchLength;00444                                 m_previousMatch = matchPosition;00445                                 LiteralByte(m_byteBuffer[m_stringStart-1]);00446                                 m_stringStart++;00447                                 m_lookahead--;00448                         }00449                 }00450                 <span class="keywordflow">else</span>00451                 {00452                         m_previousLength = LongestMatch(m_previousMatch);00453                         m_matchAvailable = <span class="keyword">true</span>;00454                         m_stringStart++;00455                         m_lookahead--;00456                 }00457         }00458         assert(m_stringStart - (m_blockStart+m_blockLength) &lt;= 1);00459         <span class="keywordflow">if</span> (m_minLookahead == 0 &amp;&amp; m_matchAvailable)00460         {00461                 LiteralByte(m_byteBuffer[m_stringStart-1]);00462                 m_matchAvailable = <span class="keyword">false</span>;00463         }00464 }00465 <a name="l00466"></a><a class="code" href="class_deflator.html#_zlib_compressora7">00466</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_deflator.html#_zlib_compressora7">Deflator::Put2</a>(<span class="keyword">const</span> byte *str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking)00467 {00468         <span class="keywordflow">if</span> (!blocking)00469                 <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">"Deflator"</span>);00470 00471         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> accepted = 0;00472         <span class="keywordflow">while</span> (accepted &lt; length)00473         {00474                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> newAccepted = FillWindow(str+accepted, length-accepted);00475                 ProcessBuffer();00476                 <span class="comment">// call ProcessUncompressedData() after WritePrestreamHeader()</span>00477                 ProcessUncompressedData(str+accepted, newAccepted);00478                 accepted += newAccepted;00479         }00480         assert(accepted == length);00481 00482         <span class="keywordflow">if</span> (messageEnd)00483         {00484                 m_minLookahead = 0;00485                 ProcessBuffer();00486                 EndBlock(<span class="keyword">true</span>);00487                 FlushBitBuffer();00488                 WritePoststreamTail();00489                 Reset();00490         }00491 00492         Output(0, NULL, 0, messageEnd, blocking);00493         <span class="keywordflow">return</span> 0;00494 }00495 00496 <span class="keywordtype">bool</span> Deflator::IsolatedFlush(<span class="keywordtype">bool</span> hardFlush, <span class="keywordtype">bool</span> blocking)00497 {00498         <span class="keywordflow">if</span> (!blocking)00499                 <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">"Deflator"</span>);00500 00501         m_minLookahead = 0;00502         ProcessBuffer();00503         m_minLookahead = MAX_MATCH;00504         EndBlock(<span class="keyword">false</span>);00505         <span class="keywordflow">if</span> (hardFlush)00506                 EncodeBlock(<span class="keyword">false</span>, STORED);00507         <span class="keywordflow">return</span> <span class="keyword">false</span>;00508 }00509 00510 <span class="keywordtype">void</span> Deflator::LiteralByte(byte b)00511 {00512         m_matchBuffer[m_matchBufferEnd++].literalCode = b;00513         m_literalCounts[b]++;00514 00515         <span class="keywordflow">if</span> (m_blockStart+(++m_blockLength) == m_byteBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>() || m_matchBufferEnd == m_matchBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00516                 EndBlock(<span class="keyword">false</span>);00517 }00518 00519 <span class="keywordtype">void</span> Deflator::MatchFound(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distance, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00520 {00521         <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthCodes[] = {00522                 257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268, 268,00523                 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272,00524                 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274,00525                 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, 276, 276,00526                 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,00527                 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,00528                 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,00529                 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,00530                 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,00531                 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,00532                 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,00533                 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,00534                 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,00535                 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,00536                 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,00537                 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 285};00538         <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthBases[] = {3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258};00539         <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceBases[30] = 00540                 {1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577};00541 00542         EncodedMatch &amp;m = m_matchBuffer[m_matchBufferEnd++];00543         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthCode = lengthCodes[length-3];00544         m.literalCode = lengthCode;00545         m.literalExtra = length - lengthBases[lengthCode-257];00546         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> distanceCode = upper_bound(distanceBases, distanceBases+30, distance) - distanceBases - 1;00547         m.distanceCode = distanceCode;00548         m.distanceExtra = distance - distanceBases[distanceCode];00549 00550         m_literalCounts[lengthCode]++;00551         m_distanceCounts[distanceCode]++;00552 00553         <span class="keywordflow">if</span> (m_blockStart+(m_blockLength+=length) == m_byteBuffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>() || m_matchBufferEnd == m_matchBuffer.size())00554                 EndBlock(<span class="keyword">false</span>);00555 }00556 00557 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> CodeLengthEncode(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> *begin, 

⌨️ 快捷键说明

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