📄 bitio.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 + -