📄 bit_buffer.c
字号:
#include "spiht.h"
#include "spihtdecode.h"
int QccBitBufferInitialize(QccBitBuffer *bit_buffer)
{
QccStringMakeNull(bit_buffer->filename);
bit_buffer->fileptr = NULL;
bit_buffer->type = QCCBITBUFFER_OUTPUT;
bit_buffer->bit_cnt = 0;
bit_buffer->byte_cnt = 0;
bit_buffer->bits_to_go = 8;
bit_buffer->buffer = 0;
return(0);
}
int QccBitBufferStart(QccBitBuffer *bit_buffer)
{
int return_value;
if (bit_buffer == NULL)
return(0);
if (bit_buffer->fileptr == NULL)
{
if (bit_buffer->type == QCCBITBUFFER_OUTPUT)
{
if ((bit_buffer->fileptr = QccFileOpen(bit_buffer->filename,
"w")) == NULL)
{
QccErrorAddMessage("(QccBitBufferStart): Error calling QccFileOpen()");
goto QccError;
}
}
else
{
if ((bit_buffer->fileptr = QccFileOpen(bit_buffer->filename,
"r")) == NULL)
{
QccErrorAddMessage("(QccBitBufferStart): Error calling QccFileOpen()");
goto QccError;
}
}
}
bit_buffer->buffer = 0;
if (bit_buffer->type == QCCBITBUFFER_INPUT)
bit_buffer->bits_to_go = 0;
else
bit_buffer->bits_to_go = 8;
return_value = 0;
goto QccReturn;
QccError:
return_value = 1;
QccReturn:
return(return_value);
}
int QccBitBufferEnd(QccBitBuffer *bit_buffer)
{
if (bit_buffer == NULL)
return(0);
if (QccFileClose(bit_buffer->fileptr))
{
QccErrorAddMessage("(QccBitBufferEnd): Error calling QccFileClose()");
return(1);
}
bit_buffer->fileptr = NULL;
return(0);
}
int QccBitBufferFlush(QccBitBuffer *bit_buffer)
{
if (bit_buffer == NULL)
return(0);
if (bit_buffer->fileptr == NULL)
return(0);
if (bit_buffer->type == QCCBITBUFFER_OUTPUT)
{
if (bit_buffer->bits_to_go != 8)
{
bit_buffer->buffer >>= bit_buffer->bits_to_go;
if (QccFileWriteChar(bit_buffer->fileptr,
(char)(bit_buffer->buffer)))
{
QccErrorAddMessage("(QccBitBufferFlush): Error calling QccFileWriteChar()");
return(1);
}
bit_buffer->byte_cnt++;
}
bit_buffer->bits_to_go = 8;
bit_buffer->buffer = 0;
if (QccFileFlush(bit_buffer->fileptr))
{
QccErrorAddMessage("(QccBitBufferFlush): Error calling QccFileFlush()");
return(1);
}
}
else
bit_buffer->bits_to_go = 0;
return(0);
}
int QccBitBufferPutBit(QccBitBuffer *bit_buffer, int bit_value)
{
if (bit_buffer == NULL)
return(0);
if (bit_buffer->type != QCCBITBUFFER_OUTPUT)
{
QccErrorAddMessage("(QccBitBufferPutBit): Not an output buffer");
return(1);
}
bit_buffer->buffer >>= 1;
if (bit_value)
bit_buffer->buffer |= 0x80;
bit_buffer->bits_to_go--;
bit_buffer->bit_cnt++;
if (!bit_buffer->bits_to_go)
{
if (QccFileWriteChar(bit_buffer->fileptr,
(char)bit_buffer->buffer))
{
QccErrorAddMessage("(QccBitBufferPutBit): Error calling QccFileWriteChar()");
return(1);
}
bit_buffer->buffer = 0;
bit_buffer->bits_to_go = 8;
bit_buffer->byte_cnt++;
}
return(0);
}
int QccBitBufferGetBit(QccBitBuffer *bit_buffer, int *bit_value)
{
if (bit_buffer == NULL)
return(0);
if (bit_buffer->type != QCCBITBUFFER_INPUT)
{
QccErrorAddMessage("(QccBitBufferPutBit): Not an input buffer");
return(1);
}
if (!bit_buffer->bits_to_go)
{
if (QccFileReadChar(bit_buffer->fileptr, (char *)&(bit_buffer->buffer)))
{
QccErrorAddMessage("(QccBitBufferGetBit): Error calling QccFileReadChar()");
return(1);
}
bit_buffer->bits_to_go = 8;
bit_buffer->byte_cnt++;
}
*bit_value = bit_buffer->buffer & 0x01;
bit_buffer->buffer >>= 1;
bit_buffer->bits_to_go--;
bit_buffer->bit_cnt++;
return(0);
}
int QccBitBufferGetChar(QccBitBuffer *bit_buffer, unsigned char *val)
{
int bit_value;
int bit;
unsigned char mask = 0x01;
if (bit_buffer == NULL)
return(0);
if (val == NULL)
return(0);
*val = 0;
for (bit = 0; bit < 8; bit++)
{
if (QccBitBufferGetBit(bit_buffer, &bit_value))
{
QccErrorAddMessage("(QccBitBufferGetChar): Error calling QccBitBufferGetBit()");
return(1);
}
if (bit_value)
*val |= mask;
mask <<= 1;
}
return(0);
}
int QccBitBufferGetInt(QccBitBuffer *bit_buffer, int *val)
{
unsigned char ch[QCC_INT_SIZE];
int byte_cnt;
if (bit_buffer == NULL)
return(0);
if (val == NULL)
return(0);
for (byte_cnt = 0; byte_cnt < QCC_INT_SIZE; byte_cnt++)
if (QccBitBufferGetChar(bit_buffer, &ch[byte_cnt]))
{
QccErrorAddMessage("(QccBitBufferGetInt): Error calling QccBitBufferGetChar()");
return(1);
}
QccBinaryCharToInt(ch, (unsigned int *)val);
return(0);
}
int QccBitBufferGetDouble(QccBitBuffer *bit_buffer, double *val)
{
unsigned char ch[QCC_INT_SIZE];
int byte_cnt;
float tmp;
if (bit_buffer == NULL)
return(0);
if (val == NULL)
return(0);
for (byte_cnt = 0; byte_cnt < QCC_INT_SIZE; byte_cnt++)
if (QccBitBufferGetChar(bit_buffer, &ch[byte_cnt]))
{
QccErrorAddMessage("(QccBitBufferGetDouble): Error calling QccBitBufferGetChar()");
return(1);
}
QccBinaryCharToFloat(ch, &tmp);
*val = tmp;
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -