0

我正在向我的服务器发出一个请求,该请求传回了一堆包含未压缩的标头信息的数据,然后是已请求的应使用 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 并且压缩仍然存在,因此我可以使用我的方法解压缩。

4

1 回答 1

0

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

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

这意味着不像以前那样压缩格式没有填充,然后我发现这行代码的另一个问题

err = inflateInit2(&stream, -MAX_WBITS);

所以我把它改回原来的

err = inflateInit(&stream);

一切正常。

于 2012-12-17T03:31:06.807 回答