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

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

偶爾來避難的地方~

  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在线| 欧美福利一区二区三区| 久久久视频精品| 久久综合九色九九| 欧美高清视频一区二区三区在线观看 | 国产精品拍天天在线| 欧美日韩中文字幕综合视频| 欧美日本在线看| 国产精品国产精品| 国内成人自拍视频| 亚洲免费大片| 欧美一二三视频| 麻豆精品传媒视频| 亚洲电影免费观看高清完整版在线| 欧美成人在线免费视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美一区永久视频免费观看| 久久久久久9999| 欧美日韩国产精品一区二区亚洲 | 亚洲欧美资源在线| 久久久精品网| 亚洲国产精品一区二区久| 亚洲国产日韩在线| 午夜精品视频一区| 欧美激情国产高清| 亚洲欧美激情一区二区| 免费毛片一区二区三区久久久| 欧美日韩国产成人高清视频| 国产欧美一区二区三区国产幕精品 | 18成人免费观看视频| 亚洲视频一区二区免费在线观看| 久久久噜噜噜久久狠狠50岁| 亚洲激情在线视频| 久久精品123| 国产精品二区二区三区| 亚洲国产欧美一区二区三区久久| 亚洲一级在线观看| 嫩草成人www欧美| 性欧美1819性猛交| 欧美日韩福利| 久久久久国产精品厨房| 欧美日韩中文字幕在线视频| 亚洲黄色影片| 免费试看一区| 久久精品天堂| 国产人久久人人人人爽| 亚洲视频在线免费观看| 亚洲国产经典视频| 久久综合给合久久狠狠狠97色69| 国产日韩欧美在线观看| 亚洲欧美成人在线| 一本色道久久综合狠狠躁篇的优点 | 99亚洲精品| 女同性一区二区三区人了人一| 国产伦精品一区| 午夜性色一区二区三区免费视频| 亚洲美女在线国产| 欧美日韩国产色综合一二三四| 亚洲高清不卡一区| 嫩草国产精品入口| 老色批av在线精品| 亚洲国产二区| 亚洲第一页中文字幕| 久久全球大尺度高清视频| 黄色一区二区在线| 免费不卡中文字幕视频| 蜜臀久久久99精品久久久久久| 亚洲国产激情| 亚洲人成人99网站| 一区二区三区国产在线| 欧美日韩一级片在线观看| 亚洲无线观看| 亚洲综合三区| 在线成人激情| 亚洲国产第一页| 欧美日韩国产高清视频| 亚洲欧美激情一区| 久久黄色小说| 亚洲精品一二区| 在线综合欧美| 国产一区二区三区久久久| 久久久综合免费视频| 米奇777在线欧美播放| 夜夜精品视频一区二区| 中文精品视频| 激情亚洲成人| 亚洲免费大片| 国产视频一区在线| 狠狠干综合网| 欧美电影免费观看高清| 欧美另类videos死尸| 性做久久久久久| 久久裸体艺术| 在线视频精品| 欧美在线欧美在线| 一区二区三区精密机械公司 | 先锋影音一区二区三区| 欧美一区二区高清| 99re这里只有精品6| 欧美一区观看| 一区二区国产在线观看| 亚洲欧美国产另类| 亚洲国产女人aaa毛片在线| 99pao成人国产永久免费视频| 国产亚洲毛片在线| 亚洲激情欧美激情| 国内精品福利| 亚洲视频一区二区在线观看| 狠狠久久综合婷婷不卡| 在线亚洲观看| 亚洲国产精品一区在线观看不卡| 一区二区黄色| 亚洲国产精品va在看黑人| 亚洲综合社区| 中文久久精品| 欧美激情国产高清| 久久天天狠狠| 国产九九精品视频| 亚洲视频综合在线| 一区二区不卡在线视频 午夜欧美不卡在 | 国产乱码精品1区2区3区| 亚洲成人资源网| 亚洲一区二区三区在线视频| 亚洲黄网站在线观看| 午夜激情综合网| 亚洲天堂第二页| 欧美激情亚洲精品| 国产一区二区三区日韩| 亚洲美女毛片| 99热免费精品在线观看| 美女视频网站黄色亚洲| 免费成人在线视频网站| 娇妻被交换粗又大又硬视频欧美| 亚洲欧美日韩视频一区| 欧美在线一二三四区| 国产欧美精品一区二区三区介绍| 99一区二区| 亚洲一区不卡| 国产精品久久久久久久久久三级 | 亚洲精品国产品国语在线app | 国产精品免费区二区三区观看| 亚洲欧洲一区二区三区久久| 在线观看日韩一区| 老司机午夜精品视频| 蜜臀99久久精品久久久久久软件| 一区二区视频在线观看| 久久免费高清| 亚洲精品国产精品国自产在线 | 久久精品99国产精品| 国产精品综合| 久久精品1区| 亚洲国产日韩在线一区模特| 日韩视频一区二区| 欧美日在线观看| 亚洲欧美中文在线视频| 久久亚洲影音av资源网| 亚洲电影有码| 欧美日产一区二区三区在线观看| 在线视频欧美一区| 欧美专区日韩专区| 亚洲欧洲一级| 欧美日韩在线播| 羞羞答答国产精品www一本| 久久综合精品国产一区二区三区| 亚洲国产另类久久精品| 欧美特黄一级大片| 久久国产天堂福利天堂| 亚洲日本视频| 久久久亚洲精品一区二区三区 | 久久天堂成人| 99精品国产在热久久| 国产精品视频1区| 久久久美女艺术照精彩视频福利播放| 欧美国产一区二区| 亚洲天堂网在线观看| 曰韩精品一区二区| 欧美午夜欧美| 久久成人精品视频| 99国产精品久久| 国精品一区二区三区| 欧美日韩黄色大片| 久久国产婷婷国产香蕉| 99视频有精品| 亚洲国产mv| 狠色狠色综合久久| 国产精品成人一区| 欧美国产日韩视频| 久久国产黑丝| 亚洲综合激情| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 精品成人国产| 国产麻豆综合| 欧美视频导航| 欧美不卡视频| 久久综合久久美利坚合众国| 亚洲欧美日韩直播| 在线综合视频| 一区二区三区久久| 亚洲电影在线免费观看|