더북(TheBook)

4.2.3 비트 스트림

앞 절에서 다룬 메모리 스트림은 최소 1바이트 단위로 읽고 써야 한다는 단점이 있다. 바이트의 절반 혹은 몇 비트만 쓰거나 할 수는 없는데, 네트워크 코드를 작성하다 보면 비트 수를 최대한 절약하는 것이 바람직하므로 비트 단위로 읽거나 쓰고 싶을 때가 있다. 이를 위해 메모리 비트 스트림을 구현해 두면 편리하다. 메모리 비트 스트림은 바이트 대신 비트 단위로 쪼개어 기록할 수 있는데, 코드 4-5에 출력 메모리 스트림의 코드가 있다.

코드 4-5 출력 메모리 비트 스트림 클래스

class OutputMemoryBitStream
{
public:
    OutputMemoryBitStream() { ReallocBuffer(256); }
    ~OutputMemoryBitStream() { std::free(mBuffer); }
 
    void WriteBits(uint8_t inData, size_t inBitCount);
    void WriteBits(const void* inData, size_t inBitCount);
 
    const char* GetBufferPtr() const { return mBuffer; }
    uint32_t GetBitLength() const { return mBitHead; }
    uint32_t GetByteLength() const { return (mBitHead + 7) >> 3; }
 
    void WriteBytes(const void* inData, size_t inByteCount)
    { WriteBits(inData inByteCount << 3); }
private:
    void ReallocBuffer(uint32_t inNewBitCapacity);
 
    char* mBuffer;
    uint32_t mBitHead;
    uint32_t mBitCapacity;
};

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.