magmastonealex
magmastonealex

Reputation: 426

Inflate gzipped bytes on an iPhone

I'm trying to inflate a gzipped byte buffer on an iOS 5.0. I am using the NSData category found at CocoaDev. However, every time I call gzipInflate on an NSData object, it returns "nil".

I have tried linking to libz, building for both the simulator, and a device, and tried a clean build, but none have succeeded.

The NSData object contains valid gzipped data.

Any help would be appreciated.

EDIT1: Here's the code I'm using.

            uint8_t appendArray[1];
            for (int i=0; i != 1024; i++) {
                appendArray[0] = [self readByte]; // neccessary, because [self readByte] returns a uint8_t.
                [tempdata appendBytes:appendArray length:1];
            }
            NSData *almostdata = [tempdata gzipInflate]; // Returns nil 
            assert(almostdata != nil); // Fails

Tempdata is an NSMutableData object, with 1024 bytes of capacity. readByte is a method to read one byte from a network stream. The gzipInflate method comes from here. The data from the stream is 1024 bytes long, while compressed.

EDIT2: It's a Z_BUF_ERROR, and yet the output buffer is more than large enough for the bytes.

EDIT3: This problem was only caused because I misread the network protocol. I just had to combine ALL of the data from the stream before trying to ungzip.

Upvotes: 0

Views: 897

Answers (2)

magmastonealex
magmastonealex

Reputation: 426

EDIT: This problem was only caused because I misread the network protocol. I just had to combine ALL of the data from the stream before trying to ungzip.

Upvotes: 0

Steve
Steve

Reputation: 31642

I can't see all your code - so this is a bit of a stab in the dark - but it looks like you're reading into uselessArray - but you're appending data from appendedArray...

Should this:

uselessArray[0] = [self readByte]; // neccessary, because [self readByte] returns a uint8_t.
[tempdata appendBytes:appendArray length:1];

be this:

uselessArray[0] = [self readByte]; // neccessary, because [self readByte] returns a uint8_t.
[tempdata appendBytes:uselessArray length:1];

?

Upvotes: 1

Related Questions