青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

飯中淹的避難所~~~~~

偶爾來避難的地方~

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks
#pragma once

#include 
"xStream.h"

namespace xlibplus
{
    
namespace crypt{
        template 
<bool fValue, typename TThen, typename TElse>
        
struct if_then_else
        {
            typedef TThen result;
        };

        template 
<typename TThen, typename TElse>
        
struct if_then_else<false, TThen, TElse>
        {
            typedef TElse result;
        };

        template 
<int nBits>
        
struct UnsignedTypeSelector
        {
            typedef typename if_then_else
<(nBits<=8), unsigned char, typename if_then_else<(nBits<=16), unsigned short, unsigned int>::result >::result Type;
        };

        template 
<int nMaxCodeBits = 12>
        
class xLzwDict
        {
            typedef typename UnsignedTypeSelector
<nMaxCodeBits>::Type TCode;
            typedef 
struct tagEntry
            {
                TCode nPrefix;
                TCode nPostfix;
                TCode nFirstChild;
                TCode nNext;
            }t_Entry;
        
public:
            xLzwDict( 
int nCharBits ) : m_nCodeStartIndex( (1<<nCharBits)+2 ), m_nClearCode( (1<<nCharBits) ), m_nEndCode( (1<<nCharBits)+1 ), m_nCharBits(nCharBits)
            {
                Reset();
            }

            
~xLzwDict()
            {
            }

            
bool IsDefinedCode( TCode nValue ) const
            {
                
return (IsCode( nValue ) && m_Entries[nValue].nPostfix != m_nEndCode );
            }

            
bool IsCode( TCode nValue ) const
            {
                
return (nValue >= m_nCodeStartIndex);
            }

            TCode GetFirstChar( TCode nCode ) 
const
            {
                
while( IsCode( nCode ) )
                    nCode 
= m_Entries[nCode].nPrefix;
                
return nCode;
            }

            TCode Search( TCode nPrefix, TCode nPostfix ) 
const
            {
                t_Entry 
& top = m_Entries[nPrefix];

                TCode nCode 
= top.nFirstChild;

                
while( nCode != 0 )
                {
                    
if( m_Entries[nCode].nPostfix == nPostfix )return nCode;
                    nCode 
= m_Entries[nCode].nNext;
                }

                
return 0;
            }

            TCode Add( TCode nPrefix, TCode nPostfix )
            {
                
if( m_nCodeIndex >= (1<<nMaxCodeBits) )return 0;

                t_Entry 
& top = m_Entries[nPrefix];
                t_Entry 
& cur = m_Entries[m_nCodeIndex];

                cur.nPrefix 
= nPrefix;
                cur.nPostfix 
= nPostfix;
                cur.nNext 
= top.nFirstChild;
                cur.nFirstChild 
= 0;
                top.nFirstChild 
= m_nCodeIndex;

                TCode nCode 
= m_nCodeIndex;

                
++m_nCodeIndex;

                
if( m_nCodeIndex >= (1 << m_nCodeBits) && m_nCodeBits < nMaxCodeBits ) ++ m_nCodeBits;

                
return nCode;
            }

            
void Reset()
            {
                m_nCodeIndex 
= m_nCodeStartIndex;

                m_nCodeBits 
= _CalcCodeBits( m_nCodeIndex );

                UINT nCharCount 
= (1<<m_nCharBits);

                
for( UINT n = 0;n < nCharCount;n ++ )
                {
                    m_Entries[n].nPrefix 
= n;
                    m_Entries[n].nPostfix 
= 0;
                    m_Entries[n].nNext 
= 0;
                    m_Entries[n].nFirstChild 
= 0;
                }

                
for( UINT n = nCharCount;n < (1<<nMaxCodeBits); ++n )
                {
                    m_Entries[n].nPrefix 
= m_nEndCode;
                    m_Entries[n].nPostfix 
= m_nEndCode;
                    m_Entries[n].nFirstChild 
= 0;
                    m_Entries[n].nNext 
= 0;
                }
            }

            TCode GetPrefix( TCode nCode ) 
const { 
                
if( nCode >= m_nCodeIndex )return 0;
                
return m_Entries[nCode].nPrefix;
            }

            TCode GetPostfix( TCode nCode ) 
const {
                
if( nCode >= m_nCodeIndex )return 0;
                
return m_Entries[nCode].nPostfix;
            }

            
int GetCodeBits() const { return m_nCodeBits;}
            TCode GetClearCode() 
const { return m_nClearCode;}
            TCode GetEndCode() 
const { return m_nEndCode;}
            TCode GetCodeIndex() 
const { return m_nCodeIndex;}
        
protected:
            
int _CalcCodeBits( TCode nCode )
            {
                
forint i = 1;i <= nMaxCodeBits;i ++ )
                {
                    
if( nCode < (1<<i) )return i;
                }
                
return 1;
            }


            t_Entry m_Entries[(
1<<nMaxCodeBits)];

            TCode m_nCodeIndex;
            
const TCode m_nCodeStartIndex;
            
const TCode m_nClearCode;
            
const TCode m_nEndCode;
            
int m_nCodeBits;
            
const int m_nCharBits;
        };


        template 
<int nMaxCodeBits, bool fDynamicBits = true>
        
class xLzw
        {
            typedef xLzwDict
<nMaxCodeBits> TDict;
            typedef typename UnsignedTypeSelector
<nMaxCodeBits>::Type TCode;

            template 
<bool fDynamic>
            inline 
int _GetCodeBits(TDict & dict) const 
            {
                
return dict.GetCodeBits();
            }
            template 
<>
            inline 
int _GetCodeBits<false>(TDict & dict) const 
            {
                
return nMaxCodeBits;
            }
        
public:
            xLzw( 
int nCharBits ) : m_nCharBits( nCharBits ) {}
            
~xLzw() {}

            
void Encode( IIStream * is, IOStream * os, TDict & dict )
            {
                TCode nPrefix;
                TCode nPostfix;
                TCode nCode;

                
ifis->Eof() )return;

                xIBitStream bis( 
is );
                xOBitStream bos( os );

                bis.Read( 
&nPrefix, m_nCharBits );

                
while!bis.Eof() )
                {
                    bis.Read( 
&nPostfix, m_nCharBits );
                    
                    nCode 
= dict.Search( nPrefix, nPostfix );

                    
if( nCode == 0 )
                    {
                        bos.Write( nPrefix, _GetCodeBits
<fDynamicBits>(dict) );
                        nCode 
= dict.Add( nPrefix, nPostfix );
                        
if( nCode == 0 )
                        {
                            bos.Write( dict.GetClearCode(), _GetCodeBits
<fDynamicBits>(dict) );
                            dict.Reset();
                        }
                        nPrefix 
= nPostfix;
                    }
                    
else
                    {
                        nPrefix 
= nCode;
                    }
                }

                bos.Write( nPrefix, _GetCodeBits
<fDynamicBits>(dict) );
                bos.Flush();
            }

            
void OutputCode( TCode nCode, xOBitStream & os, TDict & dict )
            {
                
if( nCode > dict.GetEndCode() )
                {
                    OutputCode( dict.GetPrefix( nCode ), os, dict );
                    OutputCode( dict.GetPostfix( nCode ), os, dict );
                }
                
else
                    os.Write( nCode, m_nCharBits );
            }

            
void Decode( IIStream * is, IOStream * os, TDict & dict )
            {
                TCode nCode 
= 0;
                TCode nOldCode 
= dict.GetEndCode();
                TCode nResult 
= 0;
                TCode nClearCode 
= dict.GetClearCode();
                TCode nEndCode 
= dict.GetEndCode();

                xIBitStream bis( 
is );
                xOBitStream bos( os );

                
while!bis.Eof() )
                {
                    bis.Read( 
&nCode, _GetCodeBits<fDynamicBits>(dict) );

                    
if( nCode == nEndCode )
                        
break;
                    
else if( nCode == nClearCode )
                    {
                        dict.Reset();
                        nOldCode 
= nEndCode;
                        
continue;
                    }
                    
else
                    {
                        
if( nCode < dict.GetCodeIndex() )
                        {
                            OutputCode( nCode, bos, dict );
                            
if( nOldCode != nEndCode )
                                nResult 
= dict.Add( nOldCode, dict.GetFirstChar( nCode ) );
                        }
                        
else if( nCode > dict.GetCodeIndex() )
                        {
                            
return;
                        }
                        
else
                        {
                            TCode nFirstChar 
= dict.GetFirstChar( nOldCode );
                            OutputCode( nOldCode, bos, dict );
                            OutputCode( nFirstChar, bos, dict );
                            nResult 
= dict.Add( nOldCode, dict.GetFirstChar( nOldCode ) );
                        }
                    }
                    nOldCode 
= nCode;
                }

                bos.Flush();
            }
        
private:
            
const int m_nCharBits;
        };
    };
};
posted on 2009-01-09 09:15 飯中淹 閱讀(1553) 評論(1)  編輯 收藏 引用

評論

# re: xLibPlus專題(2) - LZW算法 可用于GIF編解碼 2009-01-11 23:55 silvasaga
頭兒, 我來支持你下
這是你最近寫的嗎?  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线观看一区| 午夜精品国产更新| 欧美色欧美亚洲另类二区| 欧美激情五月| 欧美日韩理论| 欧美视频一区二区三区在线观看| 女同一区二区| 欧美日韩精品免费观看视频| 欧美国产三级| 国产精品每日更新| 狠狠色狠色综合曰曰| 最新成人av在线| 99re热这里只有精品免费视频| 99亚洲一区二区| 亚洲欧美日韩综合一区| 久热精品视频| 亚洲精品欧美| 亚洲免费观看高清完整版在线观看熊 | 韩国成人精品a∨在线观看| 国产自产精品| 一本色道久久综合亚洲91| 欧美尤物巨大精品爽| 蜜臀久久99精品久久久画质超高清| 欧美成人一区二区三区在线观看| 一区二区久久| 老司机午夜精品| 欧美日韩在线视频观看| 国产资源精品在线观看| 亚洲视频视频在线| 麻豆精品视频| 亚洲一区二区三区四区五区午夜| 久久久久久日产精品| 国产精品久久久久久久久免费樱桃 | 米奇777在线欧美播放| 欧美日韩国产成人高清视频| 国产亚洲精品久久久久婷婷瑜伽 | 欧美韩日一区二区三区| 国产伊人精品| 亚洲尤物在线视频观看| 欧美电影免费观看高清完整版| 一区二区三区四区精品| 欧美大片在线影院| 伊人久久久大香线蕉综合直播 | 欧美一区二区三区在线观看| 欧美伦理a级免费电影| 在线观看国产精品网站| 久久精品日产第一区二区| 99ri日韩精品视频| 欧美本精品男人aⅴ天堂| 韩日在线一区| 欧美在线亚洲综合一区| 制服诱惑一区二区| 欧美屁股在线| 日韩亚洲欧美高清| 亚洲国产欧美精品| 欧美成人伊人久久综合网| 尤物99国产成人精品视频| 欧美一区在线看| 亚洲在线一区二区三区| 国产精品福利久久久| 亚洲图片在线| 夜夜嗨av一区二区三区四季av | 久久久久久久波多野高潮日日| 亚洲午夜未删减在线观看| 欧美日韩伦理在线免费| 99精品黄色片免费大全| 亚洲国产另类精品专区| 欧美岛国激情| 99国产精品久久久久老师| 亚洲国产专区| 欧美日本中文字幕| 亚洲午夜一区| 亚洲欧美日韩在线| 狠狠色狠狠色综合日日tαg| 欧美国产综合视频| 欧美激情精品久久久久久黑人 | 国产欧美日韩一区| 欧美一区二区精品久久911| 亚洲欧美另类综合偷拍| 久久福利视频导航| 亚洲字幕一区二区| 国产视频观看一区| 麻豆精品网站| 欧美激情1区2区3区| 亚洲一区二区在线看| 欧美亚洲系列| 亚洲国产精品久久久久久女王| 欧美激情小视频| 欧美视频精品在线观看| 久久av一区二区三区漫画| 久久人人爽人人爽| 亚洲天堂av图片| 欧美在线观看你懂的| 亚洲精品女av网站| 午夜国产一区| 日韩视频一区二区三区在线播放免费观看| 99精品久久免费看蜜臀剧情介绍| 国产日韩欧美一区二区三区在线观看| 久久久亚洲一区| 欧美日韩国产成人在线| 久久综合伊人77777麻豆| 欧美日本不卡| 久久在线免费| 国产精品久久久99| 亚洲国产一区视频| 黄色av一区| 亚洲一区二区四区| 亚洲精品视频免费观看| 午夜欧美大尺度福利影院在线看| 亚洲精品老司机| 久久久999精品视频| 亚洲图片在线| 欧美黄在线观看| 美女脱光内衣内裤视频久久网站| 欧美日韩伊人| 最新中文字幕一区二区三区| 国内精品视频一区| 亚洲一区尤物| 亚洲视频免费| 欧美日韩国产精品成人| 亚洲高清视频一区| 狠狠88综合久久久久综合网| 亚洲色在线视频| 一区二区日韩免费看| 你懂的成人av| 暖暖成人免费视频| 激情视频一区二区三区| 亚洲欧美日韩中文在线制服| 亚洲手机成人高清视频| 欧美精品国产精品日韩精品| 免费在线国产精品| 国内揄拍国内精品久久| 亚洲影院色在线观看免费| 亚洲深爱激情| 欧美日韩成人免费| 日韩视频不卡| 这里只有精品视频| 欧美日韩调教| 中文一区二区| 午夜精品区一区二区三| 国产精品久久午夜| 亚洲自拍偷拍网址| 久久久久.com| 一色屋精品视频免费看| 久久久久亚洲综合| 暖暖成人免费视频| 久久精品官网| 欧美成人日韩| 亚洲精品婷婷| 亚洲视频香蕉人妖| 国产精品二区二区三区| 亚洲免费一区二区| 久久精品亚洲一区二区| 国产一区二区视频在线观看| 久久久久久91香蕉国产| 免费成人高清在线视频| 亚洲经典在线| 欧美日韩综合另类| 性一交一乱一区二区洋洋av| 老司机亚洲精品| 亚洲精品国产欧美| 欧美三级在线视频| 欧美在线二区| 欧美激情1区2区| 中文在线资源观看视频网站免费不卡| 国产精品国产自产拍高清av| 性欧美18~19sex高清播放| 久久综合九色欧美综合狠狠| 亚洲精品国产精品国自产观看浪潮| 欧美日韩精品是欧美日韩精品| 中文av字幕一区| 乱中年女人伦av一区二区| 9l视频自拍蝌蚪9l视频成人| 国产精品免费网站| 另类国产ts人妖高潮视频| 夜夜嗨av一区二区三区网页| 久久亚裔精品欧美| 亚洲午夜在线视频| 亚洲高清在线精品| 国产精品久久婷婷六月丁香| 蜜臀久久99精品久久久画质超高清| 亚洲精品美女在线观看播放| 久久精品国产77777蜜臀| 亚洲精品小视频| 国产无一区二区| 欧美精品激情在线观看| 先锋影音网一区二区| 91久久在线播放| 久久久久久久久综合| 亚洲一区日本| 99re8这里有精品热视频免费| 国内精品嫩模av私拍在线观看 | 欧美国产精品va在线观看| 亚洲欧美在线高清| 日韩手机在线导航| 在线观看av一区| 国产一区在线观看视频| 国产精品二区在线| 欧美日韩一级黄| 欧美精品xxxxbbbb|