std::vector なデータをビット単位で見る
データ代入のタイミングはコンストラクタのみ.
main.cpp
#include "bitStreamPointer.h" #include <iostream> using std::cout; using std::endl; int main ( void ) { std::vector<unsigned char> data; for ( unsigned char i = 0; i < 10; i++) { data.push_back( i ); } bitStreamPointer bsp( data ); unsigned char bit = 0; int i = 0; while ( bsp.getBit( bit ) ) { cout << (int)bit; bsp.posBitNext(); } return 0; }
bitStreamPointer.cpp
#pragma once #include "bitStreamPointer.h"
bitStreamPointer.h
#include <vector> #include <iostream> class bitStreamPointer{ private: // データ始端 unsigned char *start; // データ終端 unsigned char *end; // バイト座標.0, 1, ... size_t posByte; // ビット座標.0, 1, 2, 3, 4, 5, 6, 7 size_t posBit; // ビットマスク.start[x] との論理積を計算するために使用する unsigned char bitMask; // データ終端フラグ bool isEndPoint; public: /** コンストラクタ */ bitStreamPointer( std::vector<unsigned char> &src ) { start = &(src[0]); end = start + src.size(); posByte = 0; posBit = 0; bitMask = 1; isEndPoint = false; } /** バイトデータを得る @return 成否 */ bool getByte( unsigned char &byte) { // 終端検査 if ( isEndPoint ) { return !isEndPoint; } byte = start[posByte]; return !isEndPoint; } /** ビットデータを得る @return 成否 */ bool getBit( unsigned char &bit ) { // 終端検査 if ( isEndPoint ) { return !isEndPoint; } // マスクして右シフト bit = (start[posByte] & bitMask) >> posBit; return !isEndPoint; } /** 注目バイトを進める @return 成否 */ bool posByteNext() { // 終端検査 if ( isEndPoint ) { return !isEndPoint; } // バイト位置インクリメント posByte++; // 終端検査 if ( &start[posByte] == end ) { isEndPoint = true; } return !isEndPoint; } /** 注目ビットを進める @return 成否 */ bool posBitNext() { // 終端検査 if ( isEndPoint ) { return !isEndPoint; } // ビット位置インクリメント posBit++; // ビットマスク対応 bitMask <<= 1; // 全ビットを確認していた場合,バイト位置インクリメント if ( posBit == 8 ) { // ビット位置初期化 posBit = 0; // ビットマスク初期化 bitMask = 1; // 注目バイトを進める posByteNext(); } return !isEndPoint; } };