Decompressing bzip2
stunaep via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Apr 4 14:32:10 PDT 2016
On Monday, 4 April 2016 at 08:26:07 UTC, Thomas Brix Larsen wrote:
> On Sunday, 3 April 2016 at 02:03:29 UTC, stunaep wrote:
>> I am trying to use the bzip2 bindings that are available on
>> code.dlang.org/packages, but I am having a really hard time
>> using it due to the pointers. It needs to be an array once
>> it's decompressed.
>>
>> Here is what I have:
>>>>import std.stdio;
>>>>import bzlib;
>>>>
>>>>void main(string[] args)
>>>>{
>>>>
>>>> File f = File("./test.bz2");
>>>> ubyte[] data = new ubyte[f.size];
>>>> f.rawRead(data);
>>>> writeln(data);
>>>>
>>>> ubyte* output;
>>>> uint avail_out;
>>>> bz_stream* stream = new bz_stream();
>>>> stream.avail_out = avail_out;
>>>> stream.next_out = output;
>>>>
>>>> int init_error = BZ2_bzDecompressInit(stream, 0, 0);
>>>> int bzipresult = BZ2_bzDecompress(stream);
>>>>
>>>> stream.avail_in = cast(uint) data.length;
>>>> stream.next_in = cast(ubyte*) data;
>>>>
>>>> bzipresult = BZ2_bzDecompress(stream);
>>>> int read = stream.total_out_lo32;
>>>> BZ2_bzDecompressEnd(stream);
>>>> delete stream;
>>>> writeln(output);
>>>>}
>>
>> It's not working at all so any help would be very much
>> appreciated.
>
> You need to allocate the output array:
>
> import std.stdio;
> import bzlib;
>
> void main(string[] args)
> {
> File f = File("./test.bz2");
> auto data = new ubyte[](f.size);
> f.rawRead(data);
> writeln(data);
>
> auto output = new ubyte[](4096);
> scope stream = new bz_stream();
> stream.avail_out = cast(uint)output.length;
> stream.next_out = output.ptr;
>
> int init_error = BZ2_bzDecompressInit(stream, 0, 0);
> int bzipresult = BZ2_bzDecompress(stream);
>
> stream.avail_in = cast(uint)data.length;
> stream.next_in = data.ptr;
>
> bzipresult = BZ2_bzDecompress(stream);
> int read = stream.total_out_lo32;
> BZ2_bzDecompressEnd(stream);
> writeln(output);
> }
Can you please explain what the scope keyword does and if there
is any benefit to using
"new byte[](size)" over "new byte[size]" with a 1D array?
More information about the Digitalmars-d-learn
mailing list