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

📄 bitio.c

📁 用c++实现文件的压缩
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include "bitio.h"
#include "errhand.h"

#define PACIFIER_COUNT 2047

BIT_FILE * OpenOutputBitFile( char * name )
{
  BIT_FILE * bit_file;

  bit_file=( BIT_FILE * )calloc( 1,sizeof( BIT_FILE ) );
  if( bit_file==NULL )
    return( bit_file );
  bit_file->file=fopen( name,"wb" );
  bit_file->rack=0; 
  bit_file->mask=0x80;
  bit_file->pacifier_counter=0;
  return( bit_file );
}

BIT_FILE * OpenInputBitFile( char * name )
{
  BIT_FILE * bit_file;

  bit_file=( BIT_FILE * )calloc( 1,sizeof( BIT_FILE ) );
  if( bit_file==NULL )
    return( bit_file );
  bit_file->file=fopen( name,"rb" );
  bit_file->rack=0;
  bit_file->mask=0x80;
  bit_file->pacifier_counter=0;
  return( bit_file );
}
 
void CloseOutputBitFile( BIT_FILE * bit_file )
{
  if( bit_file->mask!=0x80 )
      if( putc( bit_file->rack,bit_file->file )!=bit_file->rack )
          fatal_error( "Fatal error in CloseBitFile!\n" );
  fclose( bit_file->file );
  free( ( char * ) bit_file );
}

void CloseInputBitFile( BIT_FILE * bit_file )
{
  fclose( bit_file->file );
  free( ( char * ) bit_file );
}

void OutputBit( BIT_FILE * bit_file,int bit )
{
  if( bit )
     bit_file->rack|=bit_file->mask;
  bit_file->mask>>=1;
  if( bit_file->mask==0 ) {
      if( putc( bit_file->rack,bit_file->file)!=bit_file->rack )
          fatal_error( "Fatal error in OutputBit\n" );
      else
          if( ( bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 )
              putc( '.',stdout );
      bit_file->rack=0;
      bit_file->mask=0x80;
  }
}

void OutputBits( BIT_FILE * bit_file,unsigned long code,int count )
{
  unsigned long mask;

  mask=1l<<( count-1 );
  while( mask!=0 ) {
     if( mask & code )
         bit_file->rack|=bit_file->mask;
     bit_file->mask>>=1;
     if( bit_file->mask==0 )  {
         if( putc( bit_file->rack,bit_file->file )!=bit_file->rack )
             fatal_error( "Fatal error in Outputbits!\n" );
         else if( ( bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 )
             putc( '.',stdout );
         bit_file->rack=0;
         bit_file->mask=0x80;
        }
     mask >>= 1;
  }
}

int InputBit( BIT_FILE * bit_file )
{
  int value;

  if( bit_file->mask==0x80 ) {
      bit_file->rack=getc( bit_file->file );
      if( bit_file->rack==EOF )
          fatal_error( "Fatal error in InputBit!(1)" );
      if( (bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 )
          putc( '.',stdout );
      }
  value=bit_file->rack & bit_file->mask;
  bit_file->mask>>=1;
  if( bit_file->mask==0 )
      bit_file->mask=0x80;
  return( value?1:0 );
}

unsigned long InputBits( BIT_FILE * bit_file,int bit_count )
{
  unsigned long mask;
  unsigned long return_value;

  mask=1l<<( bit_count-1 );
  return_value=0;
  while( mask!=0 ) {
     if( bit_file->mask==0x80 ) {
         bit_file->rack=getc( bit_file->file );
         if( bit_file->rack==EOF )
             fatal_error( "Fatal error in InputBits!(2)" );
         if( ( bit_file->pacifier_counter++ & PACIFIER_COUNT )==0 )
             putc( '.',stdout );
       }
     if( bit_file->rack & bit_file->mask )
         return_value|=mask;
     mask>>=1;
     bit_file->mask>>=1;
     if( bit_file->mask==0 )
         bit_file->mask=0x80;
   }
  return( return_value );
}

void FilePrintBinary( FILE * file,unsigned int code,int bits )
{
  unsigned int mask;

  mask=1<<( bits-1 );
  while( mask!=0 ) {
    if( code & mask )
        fputc( '1',file );
    else
        fputc( '0',file );
    mask>>=1;
  }
}





 

⌨️ 快捷键说明

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