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

📄 bitio.c

📁 lz77算法("A Universal Algorithm for Sequential Data Compression")的一种简洁直观的实现。
💻 C
字号:
#include "BITIO.h"

#include <stdlib.h>

BITFILE * OpenOutputBitFile(char * chFile)
{
	BITFILE * pBitFile;

	pBitFile = (BITFILE *)malloc(sizeof(BITFILE));
	if (pBitFile == NULL)
		return NULL;

	pBitFile->bitfile = fopen(chFile, "wb");
	pBitFile->rack = 0;
	pBitFile->mask = 0x80;
	pBitFile->pacifier_counter = 0;

	return pBitFile;
}

void OutputBit(BITFILE * pBitFile, int bit)
{
	if (bit)
		pBitFile->rack |= pBitFile->mask;
	pBitFile->mask >>= 1;
	if (pBitFile->mask == 0)
	{
		if (pBitFile->rack != putc(pBitFile->rack, pBitFile->bitfile))
			printf("OutputBit: putc error.\n");
		else
		{
			pBitFile->pacifier_counter++;
			if ( (pBitFile->pacifier_counter & PACIFIER_COUNT) == 0)
				putc('.', stdout);
		}

		pBitFile->rack = 0;
		pBitFile->mask = 0x80;
	}
}

// 1 <= count <= sizeof(unsigned long) * 8
void OutputBits(BITFILE * pBitFile, unsigned long code, int count)
{
    unsigned long mask;

	mask = 1 << (count - 1);
	while (mask)
	{
		if (mask & code)
			pBitFile->rack |= pBitFile->mask;
		pBitFile->mask >>= 1;
	    if (pBitFile->mask == 0)
		{
		    if (pBitFile->rack != putc(pBitFile->rack, pBitFile->bitfile))
			    printf("OutputBits: putc error.\n");
		    else
			{
			    pBitFile->pacifier_counter++;
			    if ( (pBitFile->pacifier_counter & PACIFIER_COUNT) == 0)
				    putc('.', stdout);
			}

		    pBitFile->rack = 0;
		    pBitFile->mask = 0x80;
		}

		mask >>= 1;
	}
}


void CloseOutputBitFile(BITFILE * pBitFile)
{
	if (pBitFile->mask != 0x80)
	{
		//将最后一个字节写入文件。
	    if (pBitFile->rack != putc(pBitFile->rack, pBitFile->bitfile))
	        printf("CloseOutputBitFile: putc error.\n");
	}
	fclose(pBitFile->bitfile);
	free((void *)pBitFile);
}

BITFILE * OpenInputBitFile(char * chFile)
{
	BITFILE * pBitFile;

	pBitFile = (BITFILE *)malloc(sizeof(BITFILE));
	if (pBitFile == NULL)
		return NULL;

	pBitFile->bitfile = fopen(chFile, "rb");
	pBitFile->rack = 0;
	pBitFile->mask = 0x80;
	pBitFile->pacifier_counter = 0;

	return pBitFile;
}


int InputBit(BITFILE * pBitFile)
{
	int value;

	if (pBitFile->mask == 0x80)
	{
		pBitFile->rack = getc(pBitFile->bitfile);
		if (pBitFile->rack == EOF)	
			printf("InputBit: EOF read.\n");
		
		pBitFile->pacifier_counter++;
		if ( (pBitFile->pacifier_counter & PACIFIER_COUNT) == 0)
			putc('.', stdout);
	}

	value = pBitFile->rack & pBitFile->mask;
	pBitFile->mask >>= 1;
	if (pBitFile->mask == 0)
		pBitFile->mask = 0x80;

	return (value ? 1 : 0);
}

unsigned long InputBits(BITFILE * pBitFile, int bit_count)
{
	unsigned long mask;
	unsigned long ret;

	mask = 1 << (bit_count - 1);
	ret = 0;
	while (mask != 0)
	{
	    if (pBitFile->mask == 0x80)
		{
		    pBitFile->rack = getc(pBitFile->bitfile);
		    if (pBitFile->rack == EOF)	
			    printf("InputBit: EOF read.\n");
		
		    pBitFile->pacifier_counter++;
		    if ( (pBitFile->pacifier_counter & PACIFIER_COUNT) == 0)
			    putc('.', stdout);
		}

	    if (pBitFile->rack & pBitFile->mask)
			ret |= mask;
	    pBitFile->mask >>= 1;
	    if (pBitFile->mask == 0)
		    pBitFile->mask = 0x80;

		mask >>= 1;
	}

	return ret;
}

void CloseInputBitFile(BITFILE * pBitFile)
{
	fclose(pBitFile->bitfile);
	free((void *)pBitFile);
}

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 PrintInBinary(BITFILE * pBitFile)
{
	int value;
	int count;

	count = 0;
	while (1)
	{
		if (pBitFile->mask == 0x80)
		{
			count++;
			pBitFile->rack = getc(pBitFile->bitfile);
			if (pBitFile->rack == EOF)
				break;
		}

		value = pBitFile->rack & pBitFile->mask;
		if (value)
			fputc('1', stdout);
		else
			fputc('0', stdout);

		pBitFile->mask >>= 1;
		if (pBitFile->mask == 0)
		{
			pBitFile->mask = 0x80;
			fputc(' ', stdout);
			fputc(' ', stdout);
			if (count == 4)
			{
				fputc('\n', stdout);
				count = 0;
			}
		}
	}
	printf("\n");
}

void testOutputBit()
{
	BITFILE * pBitFile;
	unsigned long tmp;

	pBitFile = OpenOutputBitFile("e:\\temp\\test2.txt");
    
	// write 0x83 = 0b10000011
	OutputBit(pBitFile, 1);
    OutputBit(pBitFile, 0);
	OutputBit(pBitFile, 0);
	OutputBit(pBitFile, 0);
	OutputBit(pBitFile, 0);
	OutputBit(pBitFile, 0);
	OutputBit(pBitFile, 1);
	OutputBit(pBitFile, 1);

	// write 0x84 = 0b10000100
	OutputBit(pBitFile, 1);
	tmp = 0x61;
	OutputBits(pBitFile, tmp, 5);
    
	CloseOutputBitFile(pBitFile);
}

void testInputBit()
{
	BITFILE * pBitFile;
	unsigned long tmp;
	int value;
	int i;

	FILE * pFile;
	unsigned int c;

	pFile = fopen("e:\\temp\\test1.txt","wb");
    c = 0x85;
    fputc(c, pFile);
	c = 0x06;
	fputc(c, pFile);
	c = 0x07;
	fputc(c, pFile);
	fclose(pFile);

	pBitFile = OpenInputBitFile("e:\\temp\\test1.txt");

	for (i = 0; i <= 6; i++)
	{
	    value = InputBit(pBitFile);
	    if (value)
		    fputc('1', stdout);
	    else
		    fputc('0', stdout);
    }
	printf("\n");
    tmp = InputBits(pBitFile, 8);  //tmp should be 0x83 = 131.
	printf("tmp = %d\n", tmp);

	CloseInputBitFile(pBitFile);
}

void testPrintInBinary()
{
	BITFILE * pBitFile;

	pBitFile = OpenInputBitFile("e:\\temp\\test.txt");
	PrintInBinary(pBitFile);
	CloseInputBitFile(pBitFile);
}

void testFilePrintBinary()
{
	FILE * pFile;
	unsigned int c;

	pFile = fopen("e:\\temp\\test1.txt","wb");
    c = 0x050607;
    FilePrintBinary(pFile, c, 8 * 3);
	fclose(pFile);
}

⌨️ 快捷键说明

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