zlib数据没有解压缩

时间:2012-12-16 22:34:16

标签: ios nsdata zlib

我正在向我的服务器发出请求,该请求传回一堆数据,其中包含未压缩的头信息,然后是已经请求的数据,应该使用zlib进行压缩。

因此整个数据负载看起来像

  

(标题(未压缩)/数据(压缩)/结束)

在此之前,数据从未被压缩过,所以这就是我访问那里的信息的方式

cstring = (char *) malloc(sizeWithLocalOrdering + 1);
            strncpy(cstring, bytes, sizeWithLocalOrdering);
            cstring[sizeWithLocalOrdering] = '\0';
            NSString *resultString = [NSString stringWithCString:cstring encoding:NSUTF8StringEncoding];
            methodResponseData =[resultString dataUsingEncoding:NSUTF8StringEncoding];

sizeWithLocalOrdering是数据部分的大小,所以我可以从我从服务器收到的所有数据中正确读取它。

但是现在我正在恢复Zlib数据..我想知道我是如何在不破坏zlib压缩的情况下从我发送的东西中获取数据部分...因为当前我将MethodResponseData提供给我的解压缩方法如下所示

- (NSData*) dataByDecompressingData:(NSData*)data{
    NSLog(@"%@", data);
    Byte* bytes = (Byte*)[data bytes];
    NSInteger len = [data length];
    NSMutableData *decompressedData = [[NSMutableData alloc] initWithCapacity:COMPRESSION_BLOCK];
    Byte* decompressedBytes = (Byte*) malloc(COMPRESSION_BLOCK);

    z_stream stream;
    int err;
    stream.zalloc = (alloc_func)0;
    stream.zfree = (free_func)0;
    stream.opaque = (voidpf)0;

    stream.next_in = bytes;
//  err = inflateInit(&stream);
    err = inflateInit2(&stream, -MAX_WBITS);
    CHECK_ERR(err, @"inflateInit");

    while (true) {
        stream.avail_in = len - stream.total_in;
        stream.next_out = decompressedBytes;
        stream.avail_out = COMPRESSION_BLOCK;
        err = inflate(&stream, Z_NO_FLUSH);
        [decompressedData appendBytes:decompressedBytes length:(stream.total_out-[decompressedData length])];
        if(err == Z_STREAM_END)
            break;
        CHECK_ERR(err, @"inflate");
    }

    err = inflateEnd(&stream);
    CHECK_ERR(err, @"inflateEnd");

    free(decompressedBytes);
    return decompressedData;
}

它的说法是数据..而且我正在挑衅地发送methodReasponse,这是非常的NSData ...所以我能把它归结为这样的唯一原因是因为我的接收器方法从响应中拉出数据,就像我上午。

所以有两件事,你认为这是原因吗?其次你怎么认为我可以修复数据,所以它实际上是NSData,压缩仍然存在,所以我可以用我的方法解压缩。

1 个答案:

答案 0 :(得分:0)

所以我设法改变了从我收到的数据中获取字节的方式

myCompressedData = [NSData dataWithBytes:bytes length:sizeWithLocalOrdering];

这意味着压缩格式化与以前不同,然后我发现这行代码的另一个问题

err = inflateInit2(&stream, -MAX_WBITS);

所以我把它改回原来的

err = inflateInit(&stream);

并且一切正常。