亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? huff.c

?? 用于文件壓縮的huffman算法.zip 謝謝大家使用
?? C
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "bitio.h"
#include "errhand.h"
#include "main.h"

typedef struct tree_node{
  unsigned int count;
  unsigned int saved_count;
  int child_0;
  int child_1;
  }NODE;

typedef struct code{
  unsigned int code;
  int code_bits;
  }CODE;

#define END_OF_STREAM 256

void count_bytes( FILE * input,unsigned long * long_counts );
void scale_counts( unsigned long * long_counts,NODE * nodes );
int build_tree( NODE * nodes );
void convert_tree_to_code( NODE * nodes,
                           CODE * codes,
                           unsigned int code_so_far,
                           int bits,
                           int node );
void output_counts( BIT_FILE * output,NODE * nodes );
void input_counts( BIT_FILE * input,NODE * nodes );
void print_model( NODE * nodes,CODE * codes );
void compress_data( FILE * input,BIT_FILE * output,CODE * codes );
void expand_data( BIT_FILE * input,FILE * output,NODE * nodes,int root_node);
void print_char( int c );

char * CompressionName="Rights reserved JIANGSU JINSUI COMPUTER SYSTEM co. ltd\nWritten by Zhangli in 7/20/1997.\n";
char * Usage="infile outfile [-d]\n\n Specifying -d will dump the modeling data\n";


void CompressFile( FILE * input,BIT_FILE * output,int argc,char * argv[] )
{
  unsigned long * counts;
  NODE * nodes;
  CODE * codes;
  int root_node;

  counts=( unsigned long * ) calloc( 256,sizeof( unsigned long ) );
  if( counts==NULL )
      fatal_error( "Error allccating counts array\n" );
  if( ( nodes=( NODE * )calloc( 514,sizeof( NODE ) ) )==NULL )
      fatal_error( "Error allocating nodes array\n" );
  if( ( codes=( CODE * )calloc( 257,sizeof( CODE ) ) )==NULL )
      fatal_error( "Error allocating codes array!\n" );
  count_bytes( input,counts );
  scale_counts( counts,nodes );
  output_counts( output,nodes );
  root_node=build_tree( nodes );
  convert_tree_to_code( nodes,codes,0,0,root_node );
  if( argc>0 && strcmp( argv[0],"-d" )==0 )
      print_model( nodes,codes );
  compress_data( input,output,codes );
  free( ( char * ) counts );
  free( ( char * ) nodes );
  free( ( char * ) codes );
}

void ExpandFile( BIT_FILE * input,FILE * output, int argc, char * argv[] )
{
  NODE * nodes;
  int root_node;

  if( ( nodes=( NODE * )calloc( 514,sizeof( NODE ) ) )==NULL )
      fatal_error( "Error allocating nodes array!" );
  input_counts( input,nodes );
  root_node=build_tree( nodes );
  if( argc>0 && strcmp( argv[0],"-d" )==0 )
      print_model( nodes,0 );
  expand_data( input,output,nodes,root_node );
  free( ( char * ) nodes );
}

void output_counts( BIT_FILE * output,NODE * nodes )
{
  int first;
  int last;
  int next;
  int i;

  first=0;
  while( first<255 && nodes[first].count==0 )
         first++;
  for( ; first<256; first=next ){
       last=first+1;
       for( ; ; ){
            for( ; last<256; last++ )
                   if( nodes[last].count==0 )
                       break;
            last--;
            for( next=last+1; next<256; next++ )
                 if( nodes[next].count!=0 )
                     break;
            if( next>255 )
                break;
            if( ( next-last)>3 )
                break;
            last=next;
           }
       if( putc( first,output->file )!=first )
           fatal_error( "Error writing byte counts!\n" );
       if( putc( last,output->file )!=last )
           fatal_error( "Error writing byte counts!\n" );
       for( i=first; i<=last; i++ ) {
            if( putc( nodes[i].count,output->file )!=(int)nodes[i].count )
                fatal_error( "Error writing byte counts!\n" );
            }
         }
  if( putc( 0,output->file)!=0 )
      fatal_error( "Error writing byte counts!" );
}
        
void input_counts( BIT_FILE * input,NODE * nodes )
{
  int first;
  int last;
  int i;
  int c;

  for( i=0; i<256; i++ )
       nodes[i].count=0;
  if( ( first=getc( input->file ) )==EOF )
      fatal_error( "Error reading byte counts!(1)\n" );
  if( ( last=getc( input->file ) )==EOF )
      fatal_error( "Error reading byte counts!(2)\n" );
  for( ; ; ){
       for( i=first; i<=last; i++ )
            if( ( c=getc( input->file ) )==EOF )
                fatal_error( "Error reading byte counts!(3)\n" );
             else
                nodes[i].count=( unsigned int ) c;
       if( ( first=getc( input->file ) )==EOF )
           fatal_error( "Error reading byte counts!(4)\n" );
       if( first==0 )
           break;
       if( ( last=getc( input->file ) )==EOF )
           fatal_error( "Error reading byte counts!(5)\n" );
        }
  nodes[END_OF_STREAM].count=1;
}

#ifndef SEEK_SET
#define SEEK_SET 0
#endif

void count_bytes( FILE * input,unsigned long * counts )
{
  long input_marker;
  int c;

  input_marker=ftell( input );
  while( ( c=getc( input ) )!=EOF )
         counts[c]++;
  fseek( input,input_marker,SEEK_SET );
}

void scale_counts( unsigned long * counts,NODE * nodes )
{
  unsigned long max_count;
  int i;

  max_count=0;
  for( i=0; i<256; i++ )
       if( counts[i]>max_count )
           max_count=counts[i];
  if( max_count==0 ) {
      counts[0]=1;
      max_count=1;
    }
  max_count=max_count/255;
  max_count=max_count+1;
  for( i=0; i<256; i++ ) {
       nodes[i].count=( unsigned int )( counts[i]/max_count );
       if( nodes[i].count==0 && counts[i]!=0 )
           nodes[i].count=1;
      }
  nodes[END_OF_STREAM].count=1;
}


int build_tree( NODE * nodes )
{
  int next_tree;
  int i;
  int min_1;
  int min_2;

  nodes[513].count=0xffff;
  for( next_tree=END_OF_STREAM+1; ; next_tree++ ){
       min_1=513;
       min_2=513;
       for( i=0; i<next_tree; i++ )
            if( nodes[i].count!=0 ){
                if( nodes[i].count<nodes[min_1].count ) {
                    min_2=min_1;
                    min_1=i;
                  }
                else if( nodes[i].count<nodes[min_2].count )
                     min_2=i;
                }
       if( min_2==513 )
           break;
       nodes[next_tree].count=nodes[min_1].count+nodes[min_2].count;
       nodes[min_1].saved_count=nodes[min_1].count;
       nodes[min_1].count=0;
       nodes[min_2].saved_count=nodes[min_2].count;
       nodes[min_2].count=0;
       nodes[next_tree].child_0=min_1;
       nodes[next_tree].child_1=min_2;
     }
  next_tree--;
  nodes[next_tree].saved_count=nodes[next_tree].count;
  return( next_tree );
}


void convert_tree_to_code( NODE * nodes,CODE * codes,
                           unsigned int code_so_far,int bits,int node)
{
  if( node<=END_OF_STREAM) {
      codes[node].code=code_so_far;
      codes[node].code_bits=bits;
      return;
     }
  code_so_far<<=1;
  bits++;
  convert_tree_to_code( nodes,codes,code_so_far,bits,nodes[node].child_0 );
  convert_tree_to_code( nodes,codes,code_so_far|1,bits,nodes[node].child_1);
}

void print_model( NODE * nodes, CODE * codes )
{
  int i;

  for( i=0; i<513; i++ ) {
       if( nodes[i].saved_count!=0 ) {
           printf( "node=" );
           print_char( i );
           printf( "count=%3d",nodes[i].saved_count );
           printf( "child_0=" );
           print_char( nodes[i].child_0 );
           printf( "child_1=" );
           print_char( nodes[i].child_1 );
           if( codes && i<=END_OF_STREAM ){
               printf( "Huffman code=" );
               FilePrintBinary( stdout,codes[i].code,codes[i].code_bits );
             }
           printf( "\n" );
         }
    }
}


void print_char( int c )
{
  if( c>=0x20 && c<127 )
      printf( "%c",c );
  else
      printf( "%3d",c );
}


void compress_data( FILE * input,BIT_FILE * output,CODE * codes )
{
  int c;

  while( ( c=getc( input ) )!=EOF )
         OutputBits( output,(unsigned long)codes[c].code,codes[c].code_bits);
  OutputBits( output,(unsigned long)codes[END_OF_STREAM].code,
              codes[END_OF_STREAM].code_bits );
}


void expand_data( BIT_FILE * input,FILE * output,NODE * nodes,int root_node)
{
  int node;

  for( ; ; ){
       node=root_node;
       do{
          if( InputBit( input ) )
              node=nodes[node].child_1;
          else
              node=nodes[node].child_0;
        }while( node>END_OF_STREAM );
        if( node==END_OF_STREAM )
            break;
        if( ( putc( node,output) )!=node)
            fatal_error( "Error trying to write expanded byte to output!\n" );
      }
}



  




          

















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
7777精品伊人久久久大香线蕉经典版下载 | 欧美日免费三级在线| 中文av一区特黄| 国产精品综合视频| 精品久久久久久无| 免费成人在线观看视频| 91精品国产福利在线观看| 午夜亚洲国产au精品一区二区| 色94色欧美sute亚洲线路一久| 精品国产一区二区三区久久影院| 日韩影院在线观看| 日韩视频国产视频| 极品少妇一区二区三区精品视频| 精品日韩一区二区三区| 激情六月婷婷久久| 精品国产一区二区精华| 国产一区二区三区蝌蚪| 中文欧美字幕免费| 色综合色狠狠综合色| 亚洲一区二区在线免费观看视频| www.欧美.com| 一区二区三区四区在线| 666欧美在线视频| 国内久久精品视频| 中文字幕中文字幕一区二区| 日本韩国一区二区| 亚洲电影一区二区三区| 日韩一区二区精品| 国产精品一级片在线观看| 亚洲欧洲日韩在线| 欧美视频一区二区三区在线观看 | 欧美一区二区免费视频| 国产呦萝稀缺另类资源| 国产精品白丝在线| 777a∨成人精品桃花网| 狠狠色丁香久久婷婷综合丁香| 国产精品嫩草影院av蜜臀| 欧洲精品中文字幕| 麻豆精品国产91久久久久久| 国产精品免费视频网站| 欧美日韩精品三区| 国产精品123| 亚洲国产日日夜夜| 久久久精品黄色| 国产日韩在线不卡| 欧美精选一区二区| 国内久久婷婷综合| 亚洲成人在线观看视频| 国产日韩欧美不卡在线| 欧美日韩久久不卡| 国产a精品视频| 亚洲第一av色| 国产婷婷色一区二区三区在线| 91极品美女在线| 国产自产v一区二区三区c| 尤物av一区二区| 久久久久久99精品| 欧美三级电影精品| av成人免费在线| 久草这里只有精品视频| 亚洲自拍偷拍麻豆| 国产精品免费人成网站| 91精品在线一区二区| 91麻豆自制传媒国产之光| 久久电影网站中文字幕| 污片在线观看一区二区| 亚洲欧洲制服丝袜| 国产精品久久久久久久久晋中| 精品少妇一区二区三区视频免付费 | 久久国产人妖系列| 午夜精品久久久久久不卡8050| 国产午夜亚洲精品羞羞网站| 日韩三级视频中文字幕| 欧美三级电影精品| 在线看不卡av| 91免费版pro下载短视频| 国产成人精品影视| 国产一区在线看| 久久国产综合精品| 日本不卡不码高清免费观看| 一区二区在线观看免费| 国产精品视频yy9299一区| 精品88久久久久88久久久| 欧美日韩1区2区| 精品视频在线免费观看| 日本韩国一区二区三区| 91在线视频官网| 91色综合久久久久婷婷| 色综合久久久久久久久| 91蝌蚪porny成人天涯| 国产丶欧美丶日本不卡视频| 狠狠色综合播放一区二区| 韩国女主播一区| 国产专区综合网| 国产精品一区二区在线看| 久久99日本精品| 国内成人免费视频| 国产一区二区三区av电影| 狠狠狠色丁香婷婷综合久久五月| 精品一区二区免费看| 国产精品一区二区在线播放| 国产成人精品亚洲日本在线桃色| 国产呦萝稀缺另类资源| 粉嫩高潮美女一区二区三区| 成人黄色网址在线观看| 99久久久国产精品免费蜜臀| 欧美午夜一区二区三区免费大片| 日韩一区二区视频| 国产精品久久久久久久久免费丝袜 | 欧美色图一区二区三区| 欧美变态口味重另类| 国产精品狼人久久影院观看方式| 亚洲制服欧美中文字幕中文字幕| 麻豆一区二区99久久久久| 成人午夜在线免费| 777久久久精品| 中文字幕一区二区三区精华液| 污片在线观看一区二区| 国产91在线|亚洲| 91麻豆精品国产| 中文字幕亚洲成人| 麻豆国产欧美日韩综合精品二区 | 久久久噜噜噜久久中文字幕色伊伊| 亚洲欧美日韩综合aⅴ视频| 久久99精品国产麻豆婷婷| 色成人在线视频| 国产日韩精品视频一区| 日韩和欧美一区二区| 91麻豆免费看片| 久久久久久久久一| 三级欧美在线一区| 91香蕉视频黄| 国产日韩三级在线| 日韩av电影免费观看高清完整版在线观看 | 亚洲欧美偷拍卡通变态| 国产精品一区二区久激情瑜伽| 欧美日韩一区二区三区四区| 一色桃子久久精品亚洲| 国产福利一区在线| 日韩欧美一二三| 日韩二区三区四区| 91福利区一区二区三区| 亚洲欧美在线视频观看| 国产91综合一区在线观看| 日韩久久免费av| 日韩精品欧美成人高清一区二区| 色婷婷狠狠综合| 中文字幕视频一区| av毛片久久久久**hd| 中文一区二区完整视频在线观看| 免费观看日韩av| 日韩一区二区电影| 日韩二区三区四区| 538在线一区二区精品国产| 艳妇臀荡乳欲伦亚洲一区| 色偷偷成人一区二区三区91| 日韩一区欧美小说| 9人人澡人人爽人人精品| 国产精品成人在线观看| 99久久99久久久精品齐齐| 国产精品电影一区二区三区| av在线不卡免费看| 亚洲欧洲日韩av| 一本久道久久综合中文字幕| 亚洲人成人一区二区在线观看| 94-欧美-setu| 亚洲综合免费观看高清在线观看| 色屁屁一区二区| 亚洲a一区二区| 欧美一区二区三区白人| 久久精品999| 国产日韩欧美精品综合| 成人丝袜视频网| 国产精品久久久久婷婷| 一本到一区二区三区| 天天综合色天天综合| 欧美第一区第二区| 国产成人综合网站| 中文字幕欧美一区| 欧美日韩一区二区在线观看| 免费久久精品视频| 久久青草国产手机看片福利盒子 | 国产亚洲欧美一区在线观看| 大胆欧美人体老妇| 亚洲精品国产高清久久伦理二区| 欧美性猛片aaaaaaa做受| 免费成人在线观看| 中文字幕精品—区二区四季| 色狠狠一区二区三区香蕉| 丝袜美腿一区二区三区| 久久久精品国产99久久精品芒果| 国产精品一区在线观看乱码| 亚洲美女免费在线| 日韩欧美色电影| 成人h动漫精品| 日韩不卡一区二区| 国产精品色哟哟网站| 欧美日韩国产系列| 懂色av中文一区二区三区| 亚洲图片欧美视频|