www.pudn.com > lz77_source.rar > BITIO.c
#include "BITIO.h" #includeBITFILE * 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); }