まずは骨格になる抽象クラス。
typedef unsigned char BYTE; typedef unsigned short HALF; typedef unsigned long WORD; static const int BITS_PER_BYTE = 8; static const int BITS_PER_HALF = BITS_PER_BYTE * 2; static const int BITS_PER_WORD = BITS_PER_HALF * 2; class Reader { public: virtual ~Reader() {} BYTE readByte() { return read(); } HALF readHalf() { HALF result = readByte(); result <<= BITS_PER_BYTE; result |= readByte(); return result; } WORD readWord() { WORD result = readHalf(); result <<= BITS_PER_HALF; result |= readHalf(); return result; } protected: virtual BYTE read() = 0; };
half/wordの読み出しはビッグエンディアンということで。
続き。実際に読み出しをする具象クラス。
class ByteArrayReader : public Reader { public: ByteArrayReader(const BYTE* values, int length) : itr_(values), end_(values + length) {} protected: BYTE read() { if(itr_ < end_) return *itr_++; else return 0; } private: const BYTE* itr_; const BYTE* end_; };
追記:うっかりタブ文字をそのまま使ってしまった。修正。