基于位操作的类CBitBuffer

2016-01-29 12:22 18 1 收藏

基于位操作的类CBitBuffer,基于位操作的类CBitBuffer

【 tulaoshi.com - C语言心得技巧 】

基于位操作的类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();  // 移动当前位指针一个指定的数值偏移量,偏移量是正数时向末尾移动,偏移量是负数时向起始移动,偏移量单位时“
                        

来源:http://www.tulaoshi.com/n/20160129/1485830.html

延伸阅读
一、前言 当前Visual C++相关的编程资料中,无论是大部头的参考书,还是一些计算机杂志,对声音文件的处理都是泛泛的涉及一下,许多编程爱好者都感到对该部分的内容了解不是很透彻,本文希望能够给刚刚涉及到声音处理领域的朋友们起到一个引路的作用,帮助他们尽快进入声音处理的更深奥空间。 当前计算机系统处理声音文件有两种办法:一是使...
希望大家提出意见。修改。废话少说,先看效果: 操作类: package com.mygamemylove{ import flash.display.DisplayObject; import flash.display.Graphics; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; impor...
标签: windows 操作系统
    问: Windows XP 64 位版本与 Windows 2000 Professional 相比都有哪些优点? 答: Windows XP 64 位版本提供了一个可伸缩的高性能平台,用于运行基于 Windows 的新一代强大应用程序。这种平台的体系结构可以更有效地处理海量数据,最高可支持 16 TB 的虚拟内存。使用 64 位的 Windows,应用程序可以将足够多的数据预...
标签: Web开发
你和用户之间的网站堆栈(简化版)   在TXJS大会的最后一天,一个开发者问我: 面向对象的CSS没有给你留下一大堆基于表现的class名? 网络堆栈中的每一层都有它自己的结构。你不会期望将数据库架构用于构建PHP中间件,人们对于HTML和CSS的期望是一样一样的。HTML需要用一种能代表数据或内容的有意义的东西来书写,也就是我...
标签: Web开发
我们都知道jQUery对象中有一个类数组的元素包装集,该集合类似js中的数组一样拥有length属性,因此我们称此为类数组,下面我们就来总结下这个jQuery对象中的类数组时如何进行操作的,看看我们的jQuery为我们都提供了哪些可用的方法: size():很明显,它应该是返回包装集中的元素个数,如$('a').size()表示链接元素的个数; ...

经验教程

126

收藏

15

精华推荐

Unix类操作系统入门

Unix类操作系统入门

梅花盛开太阳下

一个简单的数据操作类

一个简单的数据操作类

张锦龙你的伙伴

一个MYSQL操作类

一个MYSQL操作类

爱欧游旅行网

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部