📄 bitio.c
字号:
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* The codes are from the book "The Data Compression Book" by Mark Nelson
* and Jean-Loup Gailly, M&T Books 1996.
*
* I did some changes to the end of file issue, but not really successful.
*
* Mow-Song, Ng 2/9/2002ge
* msng@mmu.edu.my
* http://www.pesona.mmu.edu.my/~msng
*
* I do not claim copyright to the code, but if you use them or modify them,
* please drop me a mail.
*
*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
#include "bitio.h"
BIT_FILE *OpenOutputBitFile(char *name )
{
//定义比特流文件句柄
BIT_FILE *bit_file;
//分配相应的数据缓存空间
bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) );
//打开磁盘文件,bit_file将获得其句柄
if ( bit_file == NULL )
return( bit_file );
bit_file->file = fopen( name, "wb" );
//如何文件打开失败,返回NULL
if (bit_file->file == NULL){
return NULL;
}
//写入比特流文件的标志信息
bit_file->rack = 0;
bit_file->mask = 0x80;
//返回文件的有效值
return( bit_file );
}
BIT_FILE *OpenInputBitFile(char *name )
{
//定义比特流文件句柄
BIT_FILE *bit_file;
//分配相应的数据缓存空间
bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) );
//打开磁盘文件,bit_file将获得其句柄
if ( bit_file == NULL )
return( bit_file );
bit_file->file = fopen( name, "rb" );
//如何文件打开失败,返回NULL
if (bit_file->file == NULL){
return NULL;
}
//写入比特流文件的标志信息
bit_file->rack = 0;
bit_file->mask = 0x80;
//返回文件的有效值
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 )
BitioError("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 ){
BitioError("Fatal error in OutputBit!\n" );
}
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 ){
BitioError( "Fatal error in OutputBit!\n" );
}
bit_file->rack = 0;
bit_file->mask = 0x80;
}
mask >>= 1;
}
}
int InputBit(BIT_FILE *bit_file, int *EOFflag)
{
int value;
*EOFflag=0;
if ( bit_file->mask == 0x80 ){
bit_file->rack = getc( bit_file->file );
if ( bit_file->rack == EOF ){
*EOFflag=1;
}
}
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, int *EOFflag)
{
unsigned long mask;
unsigned long return_value;
*EOFflag=0;
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 ){
*EOFflag=1;
}
}
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;
}
}
void BitioError(char *fmt, ...)
{
va_list argptr;
va_start( argptr, fmt );
printf( "BitioError: " );
vprintf( fmt, argptr );
va_end( argptr );
exit( -1 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -