Click here to Skip to main content
15,881,882 members
Articles / Programming Languages / C++
Article

CBitStream - A simple C++ class for reading and writing variable-length data

Rate me:
Please Sign up or sign in to vote.
4.23/5 (11 votes)
22 Jan 2009CPOL 46.5K   1.3K   43   7
An article on a simple C++ class for reading and writing variable-length data.

Introduction

This article is about a simple C++ class for reading and writing variable-length data streams. This feature is often required when programming compression routines like LZW, or when dealing with binary formats like Flash or PDF. It offers the developer a possibility to write binary chunks of custom size: like 11 bits, or 27 bits, etc. So, basically, output is byte-aligned, but the inner structure can hold different length data chunks.

Background

I found a working solution to this problem here on the CodeProject. But, this one is written in C# .NET, so I could not use it directly. I have not translated the original article, but written this one from scratch. I hope that someone will find this work useful.

Using the Code

Using the class CBitStream is very simple. Please see the code below:

C++
#include "BitStream.h"

CBitStream bitStream;
bitStream.WriteBit(1);
bitStream.WriteByte('a');
bitStream.WriteWord(0x4441);
bitStream.WriteDWord(0x44410D0A);
bitStream.WriteData((LPBYTE)"ANSI text...", 12);
bitStream.WriteData((LPWORD)_T("UNICODE text..."), 15);
bitStream.SaveStream(_T("Enter output file path here..."));

Points of Interest

I have found that writing the CBitStream class described in this article was not too difficult as I have thought in first place. Also, now I have a simple tool that can help me in my everyday work.

History

  • CBitStream class version 1.0.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Elektromehanika d.o.o. Nis
Serbia Serbia
He has a master degree in Computer Science at Faculty of Electronics in Nis (Serbia), and works as a C++/C# application developer for Windows platforms since 2001. He likes traveling, reading and meeting new people and cultures.

Comments and Discussions

 
GeneralMy vote of 5 Pin
Member 1091033217-Nov-15 6:34
Member 1091033217-Nov-15 6:34 
QuestionAny new/recent version of this class? Pin
junaidfcs6-May-14 10:36
junaidfcs6-May-14 10:36 
QuestionRead in order Pin
Nerexis25-Nov-13 6:22
Nerexis25-Nov-13 6:22 
GeneralSpice it up with Template functions Pin
rich_malina15-Apr-11 3:07
rich_malina15-Apr-11 3:07 
GeneralReadBits Fix Pin
Marco Giuntoni14-Apr-09 0:35
professionalMarco Giuntoni14-Apr-09 0:35 
I've tried to use the class for writing and reading short bit fields. While writing with WriteBits works OK reading seems to have an issue.
If I read 3 bits, for example, it keeps them aligned to the left reading them in the higher bits of the DWORD. I changed the function in the following way:
void CBitStream::ReadBits(DWORD& value, long nLen)
{
// Read single BITs
value = 0x00000000;
long _nLen = max(0, min(32, nLen));
BYTE currentOffset = nLen-1;
BYTE bitValue;
for (long i=0; i<_nLen; i++)
{
_ReadBit(bitValue);
value |= (bitValue << currentOffset);
currentOffset--;
}
}

In this way you always have them with the right weight.
GeneralRe: ReadBits Fix Pin
darkoman14-Apr-09 19:47
darkoman14-Apr-09 19:47 
GeneralNice Pin
BakaBug23-Jan-09 2:00
BakaBug23-Jan-09 2:00 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.