Click here to Skip to main content
Click here to Skip to main content

.NET wrapper for libbz2

By , 14 Jul 2003
 

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:

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#)

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

About the Author

leppie
Software Developer
South Africa South Africa
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralStream Compress and buffer compressmemberstaceyw14 Oct '04 - 10:53 
GeneralWhy system can't find the filememberwilliamlwl29 Mar '04 - 1:47 
QuestionCAB format compression?memberdragomir17 Feb '04 - 22:18 
QuestionSo... what do I do with it?memberfadden22 Oct '03 - 14:37 
AnswerRe: So... what do I do with it?memberfadden23 Oct '03 - 13:33 
GeneralRe: So... what do I do with it?memberMember 779040727 Mar '11 - 20:04 
GeneralAnother inspiring article by leppiememberStephane Rodriguez.16 Jul '03 - 10:00 
GeneralRe: Another inspiring article by leppiememberleppie16 Jul '03 - 13:12 
GeneralagainmemberROK_RShadow15 Jul '03 - 13:51 
GeneralRe: againmemberJan van den Baard16 Jul '03 - 6:31 
GeneralRe: againmemberleppie16 Jul '03 - 7:09 
GeneralRe: againmemberROK_RShadow16 Jul '03 - 18:11 
GeneralRe: againmemberleppie17 Jul '03 - 7:01 
GeneralRe: againsitebuilderPaul Watson16 Jul '03 - 7:19 
GeneralBTWmemberJörgen Sigvardsson15 Jul '03 - 9:35 
GeneralRe: BTWmemberleppie15 Jul '03 - 9:45 
GeneralRe: BTWmemberJörgen Sigvardsson15 Jul '03 - 10:18 
GeneralVery off topicmemberJörgen Sigvardsson15 Jul '03 - 9:35 
GeneralRe: Very off topicmemberleppie15 Jul '03 - 9:43 

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 15 Jul 2003
Article Copyright 2003 by leppie
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid