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

📄 zdeflate_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00265"></a>00265         <span class="keywordflow">if</span> (forceReset)<a name="l00266"></a>00266                 <a class="code" href="class_low_first_bit_writer.html#ccc5bffe4a9459f6ce0b5b678e4a7e04">ClearBitBuffer</a>();<a name="l00267"></a>00267         <span class="keywordflow">else</span><a name="l00268"></a>00268                 assert(<a class="code" href="class_low_first_bit_writer.html#20da2a4de9640ac6f3b785a7fff56c60">m_bitsBuffered</a> == 0);<a name="l00269"></a>00269 <a name="l00270"></a>00270         <a class="code" href="class_deflator.html#061a05e91d67cdf0d326ccf870cf7ef1">m_headerWritten</a> = <span class="keyword">false</span>;<a name="l00271"></a>00271         <a class="code" href="class_deflator.html#5241d030b8b368014b1c04281bf87fc3">m_matchAvailable</a> = <span class="keyword">false</span>;<a name="l00272"></a>00272         <a class="code" href="class_deflator.html#8e20cb9e5a29755b016386778221c825">m_dictionaryEnd</a> = 0;<a name="l00273"></a>00273         <a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a> = 0;<a name="l00274"></a>00274         <a class="code" href="class_deflator.html#e7b072afd802843284402d648e64412d">m_lookahead</a> = 0;<a name="l00275"></a>00275         <a class="code" href="class_deflator.html#3646115b10f173efb62402985657bb05">m_minLookahead</a> = <a class="code" href="class_deflator.html#5d1d2b1a7c83fa2b2ebb2adeb646d4ba76770cb68144334520c092799bbb212f">MAX_MATCH</a>;<a name="l00276"></a>00276         <a class="code" href="class_deflator.html#b42368c1d6f17579f3b5651fbf9ace6f">m_matchBufferEnd</a> = 0;<a name="l00277"></a>00277         <a class="code" href="class_deflator.html#f664ac5ab288e3099324ef2ad051719e">m_blockStart</a> = 0;<a name="l00278"></a>00278         <a class="code" href="class_deflator.html#7bbef1e0fe539c42509a7bebefc7cb1e">m_blockLength</a> = 0;<a name="l00279"></a>00279 <a name="l00280"></a>00280         <a class="code" href="class_deflator.html#dacfebd48fd53d01b9961b3e05e27b0e">m_detectCount</a> = 1;<a name="l00281"></a>00281         <a class="code" href="class_deflator.html#c03ff39f709115c8e8919da96ef7ac6f">m_detectSkip</a> = 0;<a name="l00282"></a>00282 <a name="l00283"></a>00283         <span class="comment">// m_prev will be initialized automaticly in InsertString</span><a name="l00284"></a>00284         fill(<a class="code" href="class_deflator.html#e72ff240bd264f77f2099c71966fdbf5">m_head</a>.<a class="code" href="class_sec_block.html#11a05906688172579cd3520816799446">begin</a>(), <a class="code" href="class_deflator.html#e72ff240bd264f77f2099c71966fdbf5">m_head</a>.<a class="code" href="class_sec_block.html#26d88ba73b5da0f5dd4ab87ce6345d8f">end</a>(), 0);<a name="l00285"></a>00285 <a name="l00286"></a>00286         fill(<a class="code" href="class_deflator.html#9cb0dcdc269ae9336134c259882db3bb">m_literalCounts</a>.<a class="code" href="class_sec_block.html#11a05906688172579cd3520816799446">begin</a>(), <a class="code" href="class_deflator.html#9cb0dcdc269ae9336134c259882db3bb">m_literalCounts</a>.<a class="code" href="class_sec_block.html#26d88ba73b5da0f5dd4ab87ce6345d8f">end</a>(), 0);<a name="l00287"></a>00287         fill(<a class="code" href="class_deflator.html#cf02ffb8290a1512da88d94d5e46369c">m_distanceCounts</a>.<a class="code" href="class_sec_block.html#11a05906688172579cd3520816799446">begin</a>(), <a class="code" href="class_deflator.html#cf02ffb8290a1512da88d94d5e46369c">m_distanceCounts</a>.<a class="code" href="class_sec_block.html#26d88ba73b5da0f5dd4ab87ce6345d8f">end</a>(), 0);<a name="l00288"></a>00288 }<a name="l00289"></a>00289 <a name="l00290"></a><a class="code" href="class_deflator.html#5b19de812080b7b12d0a6cc974f60b33">00290</a> <span class="keywordtype">void</span> <a class="code" href="class_deflator.html#5b19de812080b7b12d0a6cc974f60b33" title="this function can be used to set the deflate level in the middle of compression">Deflator::SetDeflateLevel</a>(<span class="keywordtype">int</span> deflateLevel)<a name="l00291"></a>00291 {<a name="l00292"></a>00292         <span class="keywordflow">if</span> (!(<a class="code" href="class_deflator.html#bf8d4e262511aa0fac24a2a5f808c6df81ef097154334c9425cc13d1da4b5e82">MIN_DEFLATE_LEVEL</a> &lt;= deflateLevel &amp;&amp; deflateLevel &lt;= <a class="code" href="class_deflator.html#bf8d4e262511aa0fac24a2a5f808c6dfd15dc39a3f833cce997c3cade5f556ca">MAX_DEFLATE_LEVEL</a>))<a name="l00293"></a>00293                 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="stringliteral">"Deflator: "</span> + IntToString(deflateLevel) + <span class="stringliteral">" is an invalid deflate level"</span>);<a name="l00294"></a>00294 <a name="l00295"></a>00295         <span class="keywordflow">if</span> (deflateLevel == <a class="code" href="class_deflator.html#028cf53ff50d3bdd7ce3b8823fb01036">m_deflateLevel</a>)<a name="l00296"></a>00296                 <span class="keywordflow">return</span>;<a name="l00297"></a>00297 <a name="l00298"></a>00298         <a class="code" href="class_deflator.html#f5ef6c8383d58a61e383ddd03b29e8ce">EndBlock</a>(<span class="keyword">false</span>);<a name="l00299"></a>00299 <a name="l00300"></a>00300         <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> configurationTable[10][4] = {<a name="l00301"></a>00301                 <span class="comment">/*      good lazy nice chain */</span><a name="l00302"></a>00302                 <span class="comment">/* 0 */</span> {0,    0,  0,    0},  <span class="comment">/* store only */</span><a name="l00303"></a>00303                 <span class="comment">/* 1 */</span> {4,    3,  8,    4},  <span class="comment">/* maximum speed, no lazy matches */</span><a name="l00304"></a>00304                 <span class="comment">/* 2 */</span> {4,    3, 16,    8},<a name="l00305"></a>00305                 <span class="comment">/* 3 */</span> {4,    3, 32,   32},<a name="l00306"></a>00306                 <span class="comment">/* 4 */</span> {4,    4, 16,   16},  <span class="comment">/* lazy matches */</span><a name="l00307"></a>00307                 <span class="comment">/* 5 */</span> {8,   16, 32,   32},<a name="l00308"></a>00308                 <span class="comment">/* 6 */</span> {8,   16, 128, 128},<a name="l00309"></a>00309                 <span class="comment">/* 7 */</span> {8,   32, 128, 256},<a name="l00310"></a>00310                 <span class="comment">/* 8 */</span> {32, 128, 258, 1024},<a name="l00311"></a>00311                 <span class="comment">/* 9 */</span> {32, 258, 258, 4096}}; <span class="comment">/* maximum compression */</span><a name="l00312"></a>00312 <a name="l00313"></a>00313         <a class="code" href="class_deflator.html#d5abb84cfaeaa82079f4c98930ba69ce">GOOD_MATCH</a> = configurationTable[deflateLevel][0];<a name="l00314"></a>00314         <a class="code" href="class_deflator.html#821630c70545472963ac78bda4b46ac1">MAX_LAZYLENGTH</a> = configurationTable[deflateLevel][1];<a name="l00315"></a>00315         <a class="code" href="class_deflator.html#29f0111d74dfdcf365f84ff070714504">MAX_CHAIN_LENGTH</a> = configurationTable[deflateLevel][3];<a name="l00316"></a>00316 <a name="l00317"></a>00317         <a class="code" href="class_deflator.html#028cf53ff50d3bdd7ce3b8823fb01036">m_deflateLevel</a> = deflateLevel;<a name="l00318"></a>00318 }<a name="l00319"></a>00319 <a name="l00320"></a><a class="code" href="class_deflator.html#a041fc5f5426862e45b164fdceba84db">00320</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_deflator.html#a041fc5f5426862e45b164fdceba84db">Deflator::FillWindow</a>(<span class="keyword">const</span> byte *str, <span class="keywordtype">size_t</span> length)<a name="l00321"></a>00321 {<a name="l00322"></a>00322         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxBlockSize = (<span class="keywordtype">unsigned</span> int)STDMIN(2UL*<a class="code" href="class_deflator.html#cbb3318729a2a96a2d957c36c7dcd158">DSIZE</a>, 0xffffUL);<a name="l00323"></a>00323 <a name="l00324"></a>00324         <span class="keywordflow">if</span> (<a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a> &gt;= maxBlockSize - <a class="code" href="class_deflator.html#5d1d2b1a7c83fa2b2ebb2adeb646d4ba76770cb68144334520c092799bbb212f">MAX_MATCH</a>)<a name="l00325"></a>00325         {<a name="l00326"></a>00326                 <span class="keywordflow">if</span> (<a class="code" href="class_deflator.html#f664ac5ab288e3099324ef2ad051719e">m_blockStart</a> &lt; DSIZE)<a name="l00327"></a>00327                         <a class="code" href="class_deflator.html#f5ef6c8383d58a61e383ddd03b29e8ce">EndBlock</a>(<span class="keyword">false</span>);<a name="l00328"></a>00328 <a name="l00329"></a>00329                 memcpy(<a class="code" href="class_deflator.html#3d899c14cdac6972d8128c32befe3c1a">m_byteBuffer</a>, <a class="code" href="class_deflator.html#3d899c14cdac6972d8128c32befe3c1a">m_byteBuffer</a> + DSIZE, DSIZE);<a name="l00330"></a>00330 <a name="l00331"></a>00331                 <a class="code" href="class_deflator.html#8e20cb9e5a29755b016386778221c825">m_dictionaryEnd</a> = <a class="code" href="class_deflator.html#8e20cb9e5a29755b016386778221c825">m_dictionaryEnd</a> &lt; DSIZE ? 0 : <a class="code" href="class_deflator.html#8e20cb9e5a29755b016386778221c825">m_dictionaryEnd</a>-DSIZE;<a name="l00332"></a>00332                 assert(<a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a> &gt;= DSIZE);<a name="l00333"></a>00333                 <a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a> -= DSIZE;<a name="l00334"></a>00334                 assert(!<a class="code" href="class_deflator.html#5241d030b8b368014b1c04281bf87fc3">m_matchAvailable</a> || <a class="code" href="class_deflator.html#f7bedc29fcbbdf6b8bf3aa8e06a3945a">m_previousMatch</a> &gt;= DSIZE);<a name="l00335"></a>00335                 <a class="code" href="class_deflator.html#f7bedc29fcbbdf6b8bf3aa8e06a3945a">m_previousMatch</a> -= DSIZE;<a name="l00336"></a>00336                 assert(<a class="code" href="class_deflator.html#f664ac5ab288e3099324ef2ad051719e">m_blockStart</a> &gt;= DSIZE);<a name="l00337"></a>00337                 <a class="code" href="class_deflator.html#f664ac5ab288e3099324ef2ad051719e">m_blockStart</a> -= DSIZE;<a name="l00338"></a>00338 <a name="l00339"></a>00339                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;<a name="l00340"></a>00340 <a name="l00341"></a>00341                 <span class="keywordflow">for</span> (i=0; i&lt;<a class="code" href="class_deflator.html#c94920fbb6c4b08bafa4ec541b9f0239">HSIZE</a>; i++)<a name="l00342"></a>00342                         <a class="code" href="class_deflator.html#e72ff240bd264f77f2099c71966fdbf5">m_head</a>[i] = SaturatingSubtract(<a class="code" href="class_deflator.html#e72ff240bd264f77f2099c71966fdbf5">m_head</a>[i], DSIZE);<a name="l00343"></a>00343 <a name="l00344"></a>00344                 <span class="keywordflow">for</span> (i=0; i&lt;DSIZE; i++)<a name="l00345"></a>00345                         <a class="code" href="class_deflator.html#ad7bfe8bebc06108c48f08d96e1f88f2">m_prev</a>[i] = SaturatingSubtract(<a class="code" href="class_deflator.html#ad7bfe8bebc06108c48f08d96e1f88f2">m_prev</a>[i], DSIZE);<a name="l00346"></a>00346         }<a name="l00347"></a>00347 <a name="l00348"></a>00348         assert(maxBlockSize &gt; <a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a>+<a class="code" href="class_deflator.html#e7b072afd802843284402d648e64412d">m_lookahead</a>);<a name="l00349"></a>00349         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> accepted = UnsignedMin(maxBlockSize-(<a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a>+<a class="code" href="class_deflator.html#e7b072afd802843284402d648e64412d">m_lookahead</a>), length);<a name="l00350"></a>00350         assert(accepted &gt; 0);<a name="l00351"></a>00351         memcpy(<a class="code" href="class_deflator.html#3d899c14cdac6972d8128c32befe3c1a">m_byteBuffer</a> + <a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a> + <a class="code" href="class_deflator.html#e7b072afd802843284402d648e64412d">m_lookahead</a>, str, accepted);<a name="l00352"></a>00352         <a class="code" href="class_deflator.html#e7b072afd802843284402d648e64412d">m_lookahead</a> += accepted;<a name="l00353"></a>00353         <span class="keywordflow">return</span> accepted;<a name="l00354"></a>00354 }<a name="l00355"></a>00355 <a name="l00356"></a><a class="code" href="class_deflator.html#44c260b1a4ac0fa54e5e80c4df0ff121">00356</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_deflator.html#44c260b1a4ac0fa54e5e80c4df0ff121">Deflator::ComputeHash</a>(<span class="keyword">const</span> byte *str)<span class="keyword"> const</span><a name="l00357"></a>00357 <span class="keyword"></span>{<a name="l00358"></a>00358         assert(str+3 &lt;= <a class="code" href="class_deflator.html#3d899c14cdac6972d8128c32befe3c1a">m_byteBuffer</a> + <a class="code" href="class_deflator.html#42a99f00a21bdf38d9daa15dd2ec8a5d">m_stringStart</a> + <a class="code" href="class_deflator.html#e7b072afd802843284402d648e64412d">m_lookahead</a>);<a name="l00359"></a>00359         <span class="keywordflow">return</span> ((str[0] &lt;&lt; 10) ^ (str[1] &lt;&lt; 5) ^ str[2]) &amp; <a class="code" href="class_deflator.html#dc06bdafc7a354d1665bf141e3ddc9cc">HMASK</a>;

⌨️ 快捷键说明

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