在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > LZW壓縮類實現(xiàn)無損壓縮比居然到了可恥的4:1

            LZW壓縮類實現(xiàn)無損壓縮比居然到了可恥的4:1

            作者: 時間:2016-12-01 來源:網(wǎng)絡 收藏

            //保存最后的輸入符號
            oldcode=incode;
            //返回符號擴展后的第一個字節(jié)
            return firstcode;

            }//華麗的分割線--------------------------------------------------------
            void CLZW::flush_packet()
            //清空所有積累的數(shù)據(jù)
            {
            if(bytesinpkt>0)
            {
            //所寫入的長度必須大于0
            packetbuf[0]=(char)bytesinpkt++;
            if(fwrite(packetbuf,1,bytesinpkt,outfile)!=(size_t)bytesinpkt) printf("文件寫入錯誤!");
            bytesinpkt=0;
            }

            }

            //華麗的分割線--------------------------------------------------------
            void CLZW::CHAR_OUT(int c)
            //向緩沖區(qū)增加一個字節(jié)同時在有必要時向磁盤寫數(shù)據(jù)
            {
            packetbuf[++bytesinpkt]=(char)(c);
            if(bytesinpkt>=255) flush_packet();
            }

            //華麗的分割線--------------------------------------------------------
            //發(fā)送一個n_bits比特的代碼并重組一個8為的字節(jié)
            void CLZW::output(code_int code)
            {
            cur_accum|=((INT32)code)<cur_bits+=n_bits;
            while(cur_bits>=8)
            {
            CHAR_OUT(cur_accum&0xFF);
            cur_accum>>=8;
            cur_bits-=8;
            }
            //如果下一個輸入比最大的代碼大則增加它
            if(free_code>maxcode)
            {
            n_bits++;
            if(n_bits==MAX_LZW_BITS) maxcode=LZW_TABLE_SIZE;else maxcode=MAXCODE(n_bits);
            }
            }

            //華麗的分割線--------------------------------------------------------
            void CLZW::clear_hash()
            //清空hash表
            {
            memset((void*)hash_code,0,HSIZE*sizeof(code_int));
            }

            //華麗的分割線--------------------------------------------------------
            void CLZW::clear_block()
            //重置壓縮并發(fā)送一個清除碼
            {
            clear_hash();
            free_code=ClearCode+2;
            output(ClearCode);
            n_bits=init_bits;
            maxcode=MAXCODE(n_bits);
            }

            //華麗的分割線--------------------------------------------------------
            void CLZW::compress_init(FILE* file,int ibits)
            //初始化LZW壓縮
            {
            //初始化所有靜態(tài)變量給hash表分配內存
            hash_code=(code_int*)malloc(HSIZE*sizeof(code_int));
            hash_prefix=(code_int*)malloc(HSIZE*sizeof(code_int));
            hash_suffix=(UINT_8*)malloc(HSIZE*sizeof(UINT_8));

            outfile=file;
            n_bits=init_bits=ibits;

            maxcode=MAXCODE(n_bits);
            ClearCode=((code_int)1<<(init_bits-1));
            EOFCode=ClearCode+1;
            free_code=ClearCode+2;
            first_byte=true;

            //初始化緩沖區(qū)變量
            bytesinpkt=0;
            cur_accum=0;
            cur_bits=0;
            //清理hash表
            clear_hash();
            //給定一個初始清理字符
            output(ClearCode);
            }

            //華麗的分割線--------------------------------------------------------
            void CLZW::compress_byte(int c)
            //得到和壓縮一個8位的字節(jié)
            {
            register hash_int i;
            register hash_int disp;

            if(first_byte)
            {
            //初始化一個等待碼
            waiting_code=c;
            first_byte=false;
            return;
            }

            i=((hash_int)c<<(MAX_LZW_BITS-8))+waiting_code;

            if(i>=HSIZE) i-=HSIZE;

            if(hash_code[i]!=0)
            {
            if(hash_prefix[i]==waiting_code&&hash_suffix[i]==(UINT_8)c)
            {
            waiting_code=hash_code[i];
            return;
            }

            if(i==0) disp=1; else disp=HSIZE-i;

            while(1)
            {
            i-=disp;
            if(i<0) i+=HSIZE;
            if(hash_code[i]==0) break;
            if(hash_prefix[i]==waiting_code&&hash_suffix[i]==(UINT_8)c)
            {
            waiting_code=hash_code[i];
            return;
            }
            }
            }

            //如果期望的符號不在表中
            output(waiting_code);
            if(free_code{
            //在hash表里增加一個符號
            hash_code[i]=free_code++;
            hash_prefix[i]=waiting_code;
            hash_suffix[i]=(UINT_8)c;
            }else clear_block();
            waiting_code=c;
            }

            //華麗的分割線--------------------------------------------------------
            void CLZW::compress_term()
            //結尾保存
            {
            //保存緩沖區(qū)里的代碼
            if(!first_byte) output(waiting_code);
            //發(fā)送一個結束代碼
            output(EOFCode);
            if(cur_bits>0)
            {
            CHAR_OUT(cur_accum&0xFF);
            }
            //保存緩沖區(qū)里的代碼
            flush_packet();
            }


            上一頁 1 2 下一頁

            評論


            技術專區(qū)

            關閉