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

📄 bitio.c

📁 哈夫曼(Huffman)编码压缩和解压缩程序 哈夫曼(Huffman)编码压缩和解压缩程序
💻 C
字号:
/* * Definitions for bitwise IO * * vim: ts=4 sw=4 cindent */#include <stdlib.h>#include <stdio.h>#include "bitio.h"BITFILE *OpenBitFileInput( char *filename){	BITFILE *bf;	bf = (BITFILE *)malloc( sizeof(BITFILE));	if( NULL == bf) return NULL;	if( NULL == filename)	bf->fp = stdin;	else bf->fp = fopen( filename, "rb");	if( NULL == bf->fp) return NULL;	bf->mask = 0x80;	bf->rack = 0;	return bf;}BITFILE *OpenBitFileOutput( char *filename){	BITFILE *bf;	bf = (BITFILE *)malloc( sizeof(BITFILE));	if( NULL == bf) return NULL;	if( NULL == filename)	bf->fp = stdout;	else bf->fp = fopen( filename, "wb");	if( NULL == bf->fp) return NULL;	bf->mask = 0x80;	bf->rack = 0;	return bf;}void CloseBitFileInput( BITFILE *bf){	fclose( bf->fp);	free( bf);}void CloseBitFileOutput( BITFILE *bf){	// Output the remaining bits	if( 0x80 != bf->mask) fputc( bf->rack, bf->fp);	fclose( bf->fp);	free( bf);}int BitInput( BITFILE *bf){	int value;	if( 0x80 == bf->mask){		bf->rack = fgetc( bf->fp);		if( EOF == bf->rack){			fprintf(stderr, "Read after the end of file reached\n");			exit( -1);		}	}	value = bf->mask & bf->rack;	bf->mask >>= 1;	if( 0==bf->mask) bf->mask = 0x80;	return( (0==value)?0:1);}unsigned long BitsInput( BITFILE *bf, int count){	unsigned long mask;	unsigned long value;	mask = 1L << (count-1);	value = 0L;	while( 0!=mask){		if( 1 == BitInput( bf))			value |= mask;		mask >>= 1;	}	return value;}void BitOutput( BITFILE *bf, int bit){	if( 0 != bit) bf->rack |= bf->mask;	bf->mask >>= 1;	if( 0 == bf->mask){	// eight bits in rack		fputc( bf->rack, bf->fp);		bf->rack = 0;		bf->mask = 0x80;	}}void BitsOutput( BITFILE *bf, unsigned long code, int count){	unsigned long mask;	mask = 1L << (count-1);	while( 0 != mask){		BitOutput( bf, (int)(0==(code&mask)?0:1));		mask >>= 1;	}}#if 0int main( int argc, char **argv){	BITFILE *bfi, *bfo;	int bit;	int count = 0;	if( 1<argc){		if( NULL==OpenBitFileInput( bfi, argv[1])){			fprintf( stderr, "fail open the file\n");			return -1;		}	}else{		if( NULL==OpenBitFileInput( bfi, NULL)){			fprintf( stderr, "fail open stdin\n");			return -2;		}	}	if( 2<argc){		if( NULL==OpenBitFileOutput( bfo, argv[2])){			fprintf( stderr, "fail open file for output\n");			return -3;		}	}else{		if( NULL==OpenBitFileOutput( bfo, NULL)){			fprintf( stderr, "fail open stdout\n");			return -4;		}	}	while( 1){		bit = BitInput( bfi);		fprintf( stderr, "%d", bit);		count ++;		if( 0==(count&7))fprintf( stderr, " ");		BitOutput( bfo, bit);	}	return 0;}#endif

⌨️ 快捷键说明

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