<b>基于位操作的类CBitBuffer</b>[VC/C++编程]
本文“<b>基于位操作的类CBitBuffer</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
由于工作的需求,我写了一个基于位操作的类,由CFile类模拟而来.写的对比仓促,很多操作效率较低,有待改良.
该代码对我对比有效,假如你对代码有任何改良但愿你能奉告我.Email:mymong@163.net
1、类定义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();
// 移动当前位指针一个指定的数值偏移量,偏移量是正数时向末尾移动,偏移量是负数时向起始移动,偏移量单位时“位”.
// 返回当前位指针相对起始地址的偏移量,单位时“位”,返回值假如是负数时表示失利.
//(in) llOff: 偏移量,单位"位".
LONGLONG Seek(LONGLONG llOff);
// 【构造函数】:
// 缺省构造函数没有设定缓存及其大小等,注意在利用前要设定相关内容.
CBitBuffer();
// 该构造函数设定了缓存及其大小.缓存大小缺省为0.
// 缓存大小缺省为0,你必须在实际利用前设定精确的缓存大小.
// 注意:最好不要利用该构造函数,举荐利用ShareBuffer()函数.
CBitBuffer(BYTE * pBegin, LONGLONG llLen = 0);
// 该函数重设缓存的起始地址以及缓存大小,并计算完毕地址.
// 假如你没有设定缓存的大小,缺省会被设为0,在利用前一定要设定精确的数值.
// 假如已经有一块数据区,你但愿利用CBitBuffer来管理,举荐利用该函数举行初始化.
// 注意:
// 假如是在其他地方分配的内存,利用CBitBuffer来管理,则该内存的释放不是CBitBuffer的职责.
// 假如该CBitBuffer对象已经利用Create()函数成立了缓存,则在调用Release()函数举行释放前不能利用该函数重新设定缓存.
// 假如该CBitBuffer对象已经有缓存,并且也是用该函数设定的,则可以利用该函数再次设定新的缓存.
// 利用该函数设定的缓存不被锁定,所以可以重设缓存及大小.
// 利用该函数时,假如缓存已被锁定,则会返回FALSE表示失利.
// (in) pBegin :被管理的数据区的首地址,指的是第一个字节的地址.
// (in) llLen :数据区被管理的大小,单位“位”,必须是8的倍数,倡议利用1024*8的情势输入.
BOOL ShareBuffer(BYTE * pBegin, LONGLONG llLen = 0);
// 利用输入的大小成立一块缓存,缓存大小单位是“位”,必须是8的倍数,倡议利用1024*8的情势输入.
// 缓存成立成功返回TRUE,失利返回FALSE.
// 注意:利用该函数成立缓存成功后,缓存会被锁定;调用该函数时,假如缓存已被锁定,成立会失利.
// 假如你肯定已经不再需求该缓存时,记着调用Release()函数解锁定并释放缓存.
BOOL Create(LONGLONG llLen);
// 解除缓存锁定,并释放由Create()函数成立的缓存.
void Release();
virtual ~CBitBuffer();
};
以上是“<b>基于位操作的类CBitBuffer</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |