基于位操作的类CBitBuffer

追梦赤子心994

追梦赤子心994

2016-01-29 12:22

基于位操作的类CBitBuffer,基于位操作的类CBitBuffer
基于位操作的类CBitBuffer
作者:阳光

由于工作的需要,我写了一个基于位操作的类,由CFile类模仿而来。写的比较仓促,许多操作效率较低,有待改进。
该代码对我比较有用,如果你对代码有任何改进希望你能告诉我。Email:mymong@163.net

一、类定义
class CBitBuffer  {private: LONGLONG  m_llLength;     // 缓存的大小,单位(位)。  BYTE *    m_pBegin;       // 缓存的起始指针,字节指针,指向缓存的第一个字节。 BYTE *    m_pEnd;         // 缓存的末尾指针,字节指针,指向缓存的最后一个字节的下一个字节。 BYTE *    m_pCurByte;     // 缓存的当前指针,字节指针,指向当前字节。 BYTE      m_nCurOffset;   // 从当前字节起始的位偏移量,值范围0-7。 BOOL      m_bLocked;      // 缓存是否被锁住,当你创建一块缓存时,该缓存在释放前为锁住状态,不能重新赋值头指针及缓存大小。  // 注意:m_pCurByte与m_nCurOffset联合构成位指针,可以指向当前位。
public:// 【状态相关】:  BOOL IsLocked();          // 当前是否为缓存锁住状态。  BOOL IsByteAligned();     // 当前位指针是否为字节对齐。
// 【输入输出】:  // 将当前位写为‘0’,位指针自动后移一位。  void WriteBit0();
 // 将当前位写为‘1’,位指针自动后移一位。 void WriteBit1();
 // 从当前位指针开始读取nCount个位,并将其转换为整数输出,位指针自动后移。 // (in/out) nCount: 读取的位的个数。 // 注意:该数值范围是0-32,并且确保使用该函数时保证读取数值不会越界, //      考虑到效率比较低,函数体内没有加入任何校验,需要使用者小心。 int Read(BYTE nCount);
 //  从当前位指针开始写入一串二进制数,该数以字符串形式输入,位指针自动后移。 //  参数例子: "0011 1011 0111 1111" ,空格会被忽略。  //            "*000 1111 1111 *111" ,星号所在的位会被略过而不被写入。 void WriteBinary(char * pBinStr);
 // 从当前字节指针开始写入一个16进制数,该数以字符串形式输入,位指针自动后移,位偏移置0。 // 参数例子: "00 01 BA", 空格会被忽略,字符串中不能有“0X”字符,且字母均大写。 // 注意:使用该函数前必须确保已经字节对齐了、没有"0X"、字母均大写等,函数体内没有进行校验!  void WriteHex(char * pHexStr);
 // 从当前位指针开始写入nCount个位,这nCount个位对应一个指定的数值,该数值可以以十进制或十六进制输入。 void WriteDecimal(UINT nData, int nCount);
 // 复制一段数据到当前的缓存,从当前字节指针开始写入,位指针自动后移,位偏移置0。 //  (in) pSubBuff: 源数据的头指针。 //  (in/out) nCount: 复制的长度,注意是字节的个数。  // actually writed byte count. The count may be less than nCount if the  // end of buffer was reached.  void WriteBuffer(BYTE * pSubBuff, int &nCount); // 【位置相关】: // 取得缓存的起始指针。  BYTE * GetBegin();  // 取得缓存的末尾指针,该指针指向缓存最后一个字节的下一个字节。 BYTE * GetEnd();  // 取得当前指针。  BYTE * GetCurByte();  // 取得当前位指针在当前字节的位偏移量。  BYTE GetCurOffset();  // 设定缓存的大小,单位是“位”,但是必须确保是8的倍数。 // 设定缓存大小前,需要确保缓存起始指针已经设定。 // 返回上次设定的缓存大小,如果是第一次设定,返回0。 // 如果缓存已经被锁定,则不能重设大小,返回-1表示失败。 //  (in) llLen: 缓存大小,单位是“位”,且是8的倍数,最好以1024*8的形式输入。 LONGLONG SetLength(LONGLONG llLen);
 // 取得缓存的大小,单位是“位”,应该是8的倍数。 LONGLONG GetLength();
 // 移动当前位指针到缓存的末尾,实际指向缓存最后一个字节的下一个字节的第一个位。 // 返回缓存的大小,单位是“位”,应该是8的倍数。 LONGLONG SeekToEnd();  // 移动当前位指针到缓存的起始处,实际指向缓存的第一个字节的第一个位。 void SeekToBegin();  // 移动当前位指针一个指定的数值偏移量,偏移量是正数时向末尾移动,偏移量是负数时向起始移动,偏移量单位时“      
展开更多 50%)
分享

猜你喜欢

基于位操作的类CBitBuffer

C语言教程 C语言函数
基于位操作的类CBitBuffer

基于堆的基本操作的介绍

编程语言 网络编程
基于堆的基本操作的介绍

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

扫位即时抢位操作方法

手机软件 应用软件
扫位即时抢位操作方法

操作Oracle的php类

PHP
操作Oracle的php类

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

基于AJAX的分页类实现代码

Web开发
基于AJAX的分页类实现代码

Delphi控制并行端口位操作

Delphi
Delphi控制并行端口位操作

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Flash教程:制作漂亮流动的图片效果

Flash教程:制作漂亮流动的图片效果

JSP实践要点

JSP实践要点
下拉加载更多内容 ↓