Subversion Repositories spk

Rev

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; // ERR

        this->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; // ERR

        bit = byCur & 1;
        byCur >>= 1;
        --dwBitsLeft;
        --byBits2Do;

        // did we already build a complete byte ? -> paste in buffer
        if ( !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; // ERR

        for ( 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
}