码迷,mamicode.com
首页 > 其他好文 > 详细

bit Buffer

时间:2017-08-22 00:13:53      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:type   bit   rem   printf   end   void   its   char   音频   

在音频流解析过程中,常常会涉及到顺序读取某些bit的操作。

#include<stdio.h>
typedef struct _BIT_BUF {
unsigned char buffer[1024];
unsigned int byteSize;
unsigned int bytePosition;
unsigned int bitPosition;
unsigned int wBytePosition;
}tBitBuffer;
unsigned int mask(unsigned int bit){
  switch (bit) {
    case 1:
      return 0x1;
    break;
    case 2:
      return 0x3;
    break;
    case 3:
      return 0x7;
    break;
    case 4:
      return 0xf;
    break;
    case 5:
      return 0x1f;
    break;
    case 6:
      return 0x3f;
    break;
    case 7:
      return 0x7f;
    break;
    case 8:
      return 0xff;
    break;
  }
}
unsigned long bitBuffer_readBits(tBitBuffer *pBitBuffer, unsigned int bits) {
  unsigned long result = 0;
  if (bits > 64) {
    return 0;
  }
  if (pBitBuffer->bytePosition + (pBitBuffer->bitPosition + bits + 7)/8 >pBitBuffer->byteSize) {
    return 0;
  }
  unsigned int bitsRemainning = 8 - pBitBuffer->bitPosition;
  while (bits != 0) {
    printf("bits:%d,bitPositon:%d, bitsRemainning:%d\n", bits, pBitBuffer->bitPosition, bitsRemainning);
    if (bitsRemainning > bits) {
      result <<= bits;
      pBitBuffer->bitPosition += bits;
      bitsRemainning -= bits;
      result |= (pBitBuffer->buffer[pBitBuffer->bytePosition] >> bitsRemainning) & mask(bits);
      printf("result:0x%x\n",result);
      bits = 0;
    }
    else {
      result <<= bitsRemainning;
      result |= pBitBuffer->buffer[pBitBuffer->bytePosition] & mask(bitsRemainning);
      printf("result:0x%x\n",result);
      bits -= bitsRemainning;
      pBitBuffer->bitPosition += bitsRemainning;
    }
    if (pBitBuffer->bitPosition == 8) {
      pBitBuffer->bitPosition = 0;
      bitsRemainning = 8;
      pBitBuffer->bytePosition++;
    }
  }
  return result;
}

int bitBuffer_addByte(tBitBuffer *pBitBuffer, unsigned char byte){
  pBitBuffer->buffer[pBitBuffer->wBytePosition ++] = byte;
  pBitBuffer->byteSize ++;
}

void main(void) {
  tBitBuffer bitBuffer;
  bitBuffer.byteSize = 0;
  bitBuffer.bytePosition = 0;
  bitBuffer.bitPosition = 0;
  bitBuffer.wBytePosition = 0;
  bitBuffer_addByte(&bitBuffer, 0x56);
  bitBuffer_addByte(&bitBuffer, 0xe2);
  unsigned long result = 0;
  result = bitBuffer_readBits(&bitBuffer, 2/*11*/);
  printf("result:0x%x, %d, bitPostion:%d, bytePosition:%d,byteSize:%d, wBytePosition:%d\n", result,result, bitBuffer.bitPosition, bitBuffer.bytePosition, bitBuffer.byteSize,       bitBuffer.wBytePosition);
  #if 0
  result = bitBuffer_readBits(&bitBuffer, 3);
  printf("result:0x%x, %d, bitPostion:%d, bytePosition:%d,byteSize:%d, wBytePosition:%d\n", result,result, bitBuffer.bitPosition, bitBuffer.bytePosition, bitBuffer.byteSize,   bitBuffer.wBytePosition);
  result = bitBuffer_readBits(&bitBuffer, 6);
  printf("result:0x%x, %d, bitPostion:%d, bytePosition:%d,byteSize:%d, wBytePosition:%d\n", result,result, bitBuffer.bitPosition, bitBuffer.bytePosition, bitBuffer.byteSize,   bitBuffer.wBytePosition);
  #endif
}

bit Buffer

标签:type   bit   rem   printf   end   void   its   char   音频   

原文地址:http://www.cnblogs.com/fellow1988/p/7407198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!