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

📄 bit_buffer.c

📁 spiht的压缩解压缩c编写的
💻 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 + -