fixed "end of buffer" condition
This commit is contained in:
parent
1c4c3ffdc7
commit
feaa059375
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
#include <ios>
|
#include <ios>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace IoUtilities {
|
namespace IoUtilities {
|
||||||
|
|
||||||
class LIB_EXPORT BitReader
|
class LIB_EXPORT BitReader
|
||||||
|
@ -28,17 +30,19 @@ private:
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Constructs a new BitReader.
|
* \brief Constructs a new BitReader.
|
||||||
* \remarks Does not take ownership over the specified \a buffer.
|
* \remarks
|
||||||
|
* - Does not take ownership over the specified \a buffer.
|
||||||
|
* - bufferSize must be equal or greather than 1.
|
||||||
*/
|
*/
|
||||||
inline BitReader::BitReader(const char *buffer, std::size_t bufferSize) :
|
inline BitReader::BitReader(const char *buffer, std::size_t bufferSize) :
|
||||||
m_buffer(reinterpret_cast<const byte *>(buffer)),
|
BitReader(buffer, buffer + bufferSize)
|
||||||
m_end(reinterpret_cast<const byte *>(buffer + bufferSize)),
|
|
||||||
m_bitsAvail(8)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Constructs a new BitReader.
|
* \brief Constructs a new BitReader.
|
||||||
* \remarks Does not take ownership over the specified \a buffer.
|
* \remarks
|
||||||
|
* - Does not take ownership over the specified \a buffer.
|
||||||
|
* - \a end must be greather than \a buffer.
|
||||||
*/
|
*/
|
||||||
inline BitReader::BitReader(const char *buffer, const char *end) :
|
inline BitReader::BitReader(const char *buffer, const char *end) :
|
||||||
m_buffer(reinterpret_cast<const byte *>(buffer)),
|
m_buffer(reinterpret_cast<const byte *>(buffer)),
|
||||||
|
@ -59,14 +63,14 @@ intType BitReader::readBits(byte bitCount)
|
||||||
{
|
{
|
||||||
intType val = 0;
|
intType val = 0;
|
||||||
for(byte readAtOnce; bitCount; bitCount -= readAtOnce) {
|
for(byte readAtOnce; bitCount; bitCount -= readAtOnce) {
|
||||||
readAtOnce = std::min(bitCount, m_bitsAvail);
|
|
||||||
val = (val << readAtOnce) | (((*m_buffer) >> (m_bitsAvail -= readAtOnce)) & (0xFF >> (0x08 - readAtOnce)));
|
|
||||||
if(!m_bitsAvail) {
|
if(!m_bitsAvail) {
|
||||||
m_bitsAvail = 8;
|
m_bitsAvail = 8;
|
||||||
if(++m_buffer >= m_end) {
|
if(++m_buffer >= m_end) {
|
||||||
throw std::ios_base::failure("end of buffer exceeded");
|
throw std::ios_base::failure("end of buffer exceeded");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
readAtOnce = std::min(bitCount, m_bitsAvail);
|
||||||
|
val = (val << readAtOnce) | (((*m_buffer) >> (m_bitsAvail -= readAtOnce)) & (0xFF >> (0x08 - readAtOnce)));
|
||||||
}
|
}
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue