#ifndef UNPACKER_H #define UNPACKER_H #include #include #include #include #include #include class Unpacker { static QLoggingCategory l; public: Unpacker(const QByteArray &data); template T read(); template T readLE(); QByteArray readBytes(int n); QString readFixedString(int n); QUuid readUuid(); QMap readDict(); void skip(int n); bool bad() const; private: const uchar * p(); bool checkBad(int n = 0); const QByteArray &_buf; int _offset; bool _bad; }; inline Unpacker::Unpacker(const QByteArray &data) : _buf(data), _offset(0), _bad(false) { } template inline T Unpacker::read() { if (checkBad(sizeof(T))) return 0; const uchar *u = p(); _offset += sizeof(T); return qFromBigEndian(u); } template inline T Unpacker::readLE() { if (checkBad(sizeof(T))) return 0; const uchar *u = p(); _offset += sizeof(T); return qFromLittleEndian(u); } inline void Unpacker::skip(int n) { _offset += n; checkBad(); } inline bool Unpacker::bad() const { return _bad; } inline const uchar * Unpacker::p() { return reinterpret_cast(&_buf.constData()[_offset]); } inline bool Unpacker::checkBad(int n) { if (_offset + n > _buf.size()) { _bad = true; } return _bad; } #endif // UNPACKER_H