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

.NET wrapper for libbz2

Rate me:
Please Sign up or sign in to vote.
4.44/5 (11 votes)
14 Jul 20031 min read 131.5K   1.4K   20   19
.NET wrapper for libbz2, written in MC++

BzipStream

BzipStream is a small .NET wrapper for the Bzip2 compression utility. Bz2 compression is similar to Gzip where only one file/chunk/blob is compressed, unlike zip, rar, ace, etc. Its normally used to compress a tarball (.tar file).

Below is the implementation diagram:

C#
public class BzipStream : Stream
{
  public BzipStream(string filename, FileAccess mode);
  public override void Close();
  public static byte[] Compress(byte[] buffer);
  public static byte[] Compress(byte[] buffer, int level);
  public static byte[] Decompress(byte[] buffer);
  public override void Flush();
  public static BzipStream OpenRead(string filename);
  public static BzipStream OpenWrite(string filename);
  public override int Read(byte[] buffer, int start, int length);
  public override long Seek(long pos, SeekOrigin origin);
  public override void SetLength(long len);
  public override void Write(byte[] buffer, int start, int length);
  public override bool CanRead { get; }
  public override bool CanSeek { get; }
  public override bool CanWrite { get; }
  public override long Length { get; }
  public override long Position { get; set; }
}

The De/Compress methods are utility methods to quickly de/compress a byte[]. The following methods are implemented but not supported:

  • Length
  • Position
  • Seek

Also FileAccess.ReadWrite is NOT supported.

Usage (C#)

C#
BzipStream bz = new BzipStream("file.bz2", FileAccess.Write);

Stream s = File.OpenRead("file");
int len = 8192;
byte[] buffer = new byte[len];
while ((len = s.Read(buffer, 0, len)) > 0)
{
  bz.Write(buffer, 0, len);
}
s.Close();
bz.Close();

//or using utility methods
byte[] cbuff = BzipStream.Compress(buffer);

buffer = BzipStream.Decompress(cbuff);

Implementation

libbz2 is compiled to vanilla C, and a single file (dotbz2.cpp) carries the MC++ implementation (and ONLY that file has "managed" compile flags set). Many people have been asking how to do this. Very easy. Just look.

The basic pattern is:

  1. Get .NET object
  2. Allocate memory on the heap
  3. Copy object and get an IntPtr
  4. Cast the IntPtr to void*
  5. Cast to <T>*
  6. Do unmanaged function
  7. Cast result to void*
  8. Cast to IntPtr
  9. Copy from heap to object
  10. Free heap memory

Steps 7 and 8 are not really necessary as we have a reference to the IntPtr already.

Conclusion

Just a small example of how to wrap a C library in MC++. Suggestions welcome. I could paste the code, its only 185 lines. Don't flame me for the length of the article. :)

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer
South Africa South Africa
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralStream Compress and buffer compress Pin
staceyw14-Oct-04 10:53
staceyw14-Oct-04 10:53 
GeneralWhy system can't find the file Pin
williamlwl29-Mar-04 1:47
williamlwl29-Mar-04 1:47 
QuestionCAB format compression? Pin
dragomir17-Feb-04 22:18
dragomir17-Feb-04 22:18 
QuestionSo... what do I do with it? Pin
fadden22-Oct-03 14:37
fadden22-Oct-03 14:37 
I'm new to C# and .NET, and I'm missing something here.

I can build the provided DLL with Visual Studio .NET 2003. Now what? The article shows sample usage in C#, but I can't figure out how to "link" the DLL into the C# application.

Other articles on combining C# with DLLs work on a function-by-function basis with [DllImport] attributes. Is that what's necessary here? Doesn't look like it -- the entire class seems visible.

So...what now? A full example including a working C# example (perhaps a command-line tool) would be most helpful.

AnswerRe: So... what do I do with it? Pin
fadden23-Oct-03 13:33
fadden23-Oct-03 13:33 
GeneralRe: So... what do I do with it? Pin
Member 779040727-Mar-11 20:04
Member 779040727-Mar-11 20:04 
GeneralAnother inspiring article by leppie Pin
Stephane Rodriguez.16-Jul-03 10:00
Stephane Rodriguez.16-Jul-03 10:00 
GeneralRe: Another inspiring article by leppie Pin
leppie16-Jul-03 13:12
leppie16-Jul-03 13:12 
Generalagain Pin
ROK_RShadow15-Jul-03 13:51
ROK_RShadow15-Jul-03 13:51 
GeneralRe: again Pin
Jan van den Baard16-Jul-03 6:31
professionalJan van den Baard16-Jul-03 6:31 
GeneralRe: again Pin
leppie16-Jul-03 7:09
leppie16-Jul-03 7:09 
GeneralRe: again Pin
ROK_RShadow16-Jul-03 18:11
ROK_RShadow16-Jul-03 18:11 
GeneralRe: again Pin
leppie17-Jul-03 7:01
leppie17-Jul-03 7:01 
GeneralRe: again Pin
Paul Watson16-Jul-03 7:19
sitebuilderPaul Watson16-Jul-03 7:19 
GeneralBTW Pin
Jörgen Sigvardsson15-Jul-03 9:35
Jörgen Sigvardsson15-Jul-03 9:35 
GeneralRe: BTW Pin
leppie15-Jul-03 9:45
leppie15-Jul-03 9:45 
GeneralRe: BTW Pin
Jörgen Sigvardsson15-Jul-03 10:18
Jörgen Sigvardsson15-Jul-03 10:18 
GeneralVery off topic Pin
Jörgen Sigvardsson15-Jul-03 9:35
Jörgen Sigvardsson15-Jul-03 9:35 
GeneralRe: Very off topic Pin
leppie15-Jul-03 9:43
leppie15-Jul-03 9:43 

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.