bit Buffer

在音频流解析过程中,常常会涉及到顺序读取某些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
}

时间: 2024-12-14 07:35:54

bit Buffer的相关文章

main.c 流程-buffer初始化

void buffer_init(long buffer_end)函数的理解: *   0         0x100000          0x400000                    0x10 00000(16M) *    ---------------------------------------------------------- *   |   kernel  | memery buffer   |   main memory              |      

Netty对Protocol Buffer多协议的支持(八)

Netty对Protocol Buffer多协议的支持(八) 一.背景 在上篇博文中笔者已经用代码演示了如何在netty中使用Protocol Buffer,然而细心的用户可能会发现一个明显的不足之处就是,我们的Handler只能处理一种特定的类型,而我们的项目中又不可能只有一种类型,那么这个问题该怎么解决了?多的不说,笔者直接上代码. 二.代码实现 2.1 message的编写 syntax = "proto2"; package com.rsy.netty.protobuf; op

测试不同格式下depth buffer的精度

这篇文章主要是参考MJP的"Attack of The Depth Buffer",测试不同格式下depth buffer的精度. 测试的depth buffer包含两类: 一是非线性的depth buffer,存储着perspective z(也就是最常用的,透视投影后归一化的z/w的buffer),二是线性的depth buffer,存储着view space z(这里的线性指的是在view space 中是否线性).测试的格式包括16位浮点数,32位浮点数,16位定点数,还有最常

Linux内存学习之buffer和cache的区别详解

本文和大家分享的主要是linux 中 内存buffer 和 cache 的区别相关内容,一起来看看吧,希望对大家 学习linux有所帮助. 细心的朋友会注意到, 当你在 linux 下频繁存取文件后 , 物理内存会很快被用光 , 当程序结束后 , 内存不会被正常释放 , 而是一直作为 caching. 这个问题 , 貌似有不少人在问 , 不过都没有看到有什么很好解决的办法 . 那么我来谈谈这个问题 . 先来说说free 命令 [[email protected] ~]# free -m tota

Java NIO中的缓冲区Buffer(一)缓冲区基础

什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的源码),Buffer类内部其实就是一个基本数据类型的数组,以及对这个缓冲数组的各种操作: 常见的缓冲区如ByteBuffer.IntBuffer.DoubleBuffer...内部对应的数组依次是byte.int.double... 与通道的关系 在Java NIO中,缓冲区主要是跟通道(Chann

Linux中的Buffer 与 Cache

A buffer is something that has yet to be "written" to disk.       A cache is something that has been "read" from the disk and stored for later use. 缓存(cache)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘.其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最

Potocol Buffer详解

protocol安装及使用 上一篇博文介绍了一个综合案例,这篇将详细介绍protocol buffer. 为什么使用protocol buffer? java默认序列化效率较低. apache的thrift方案并无明显优势,但是使用成本较高,安装等较为麻烦. 虽然PB不支持map,但是我们的应用中map用的较少,即使使用了存储的数据量也较少,可以转化为list方案进行存储. 以前我玩过PB,这很关键,当你有某方面的经验时能较轻松的应对一些意外情况. 保证同一消息报文新旧版本之间的兼容性 使用SO

SQL Server 2014新特性——Buffer Pool扩展

Buffer Pool扩展 Buffer Pool扩展是buffer pool 和非易失的SSD硬盘做连接.以SSD硬盘的特点来提高随机读性能. 缓冲池扩展优点 SQL Server读以随机读为主,SQL Server IO分为2部分:buffer pool管理方式,和buffer pool. SQL Server 从磁盘中读入数据,并且存放在buffer pool中以供读取和修改,修改完之后脏数据还是放在buffer pool中,当内存紧张执行lazy write把脏数据写入磁盘,并且释放内存

vim-1-window,buffer and tab

Summary:A buffer is the in-memory text of a file. A window is a viewport on a buffer. A tab page is a collection of windows. 窗口切换快捷键: nnoremap <C-j> <C-w>j        向下切换 nnoremap <C-k> <C-w>k      向上切换 nnoremap <C-h> <C-w>