Blame | Last modification | View Log | RSS feed
#include "ByteReader.h"//// constructors//ByteReader::ByteReader(void){InitVars();}ByteReader::ByteReader( void* pBuff, DWORD dwSize ){Assign( pBuff, dwSize );}//// destructor//ByteReader::~ByteReader(void){}//// Purpose:// Member variable initializer//void ByteReader::InitVars(){pBuffer = NULL;cbBuffer = 0;dwBitsLeft = dwBitsTotal = 0;byBits2Do = 8;byCur = 0;dwIndex = 0;return;}//// Purpose:// Class initialization handler//BOOL ByteReader::Assign( void *pBuff, DWORD dwSize ){InitVars();if ( !pBuff || !dwSize)return FALSE; // ERRthis->pBuffer = pBuff;this->cbBuffer = dwSize;dwBitsLeft = dwBitsTotal = dwSize * 8;byCur = ((PBYTE)pBuff)[ dwIndex++ ];return TRUE; // OK}DWORD ByteReader::GetUnusedBitCount(){return dwBitsLeft;}DWORD ByteReader::GetTotalBitCount(){return dwBitsTotal;}//// Purpose:// Returns the number of accessed bytes//DWORD ByteReader::GetReadByteCount(){DWORD dwcBitsRead = (dwBitsTotal - dwBitsLeft);DWORD c = (DWORD)(dwcBitsRead / 8);if ( dwcBitsRead % 8 ) // round up !++c;return c;}//// Purpose:// The key member function for the buffer querying//BYTE ByteReader::ReadBit(){BYTE bit = 0;if ( dwBitsLeft == 0 )return -1; // ERRbit = byCur & 1;byCur >>= 1;--dwBitsLeft;--byBits2Do;// did we already build a complete byte ? -> paste in bufferif ( !byBits2Do ){byCur = ((PBYTE)pBuffer)[ dwIndex++ ];byBits2Do = 8;}return bit; // OK}//// Purpose:// Read a 1 byte variable from the buffer//BYTE ByteReader::ReadByte(){BYTE byte = 0;for ( UINT i = 0; i < 8; i++ ){byte |= (ReadBit() << 7);if ( i != 7) // don't shift to last byte !byte >>= 1;}return byte; // OK}//// Purpose:// Read a 2 byte variable from the buffer//WORD ByteReader::ReadWord(){WORD word = 0;for ( UINT i = 0; i < 16; i++ ){word |= (ReadBit() << 15);if ( i != 15) // don't shift to last byte !word >>= 1;}return word; // OK}//// Purpose:// Read a 4 byte variable from the buffer//DWORD ByteReader::ReadDword(){DWORD dword = 0;for ( UINT i = 0; i < 32; i++ ){dword |= (ReadBit() << 31);if ( i != 31) // don't shift to last byte !dword >>= 1;}return dword; // OK}//// Purpose:// Read a user defined number of bits from the buffer//DWORD ByteReader::ReadBits( DWORD dwBitCount ){DWORD dword = 0;if ( dwBitCount > 32 )return -1; // ERRfor ( UINT i = 0; i < 32; i++ ){if ( i < dwBitCount )dword |= (ReadBit() << 31);if ( i != 31) // don't shift to last byte !dword >>= 1;}return dword; // OK}