2012-12-16 128 views
0

我正在向我的服务器发送一个请求,该服务器正在传回一堆包含未压缩的头信息的数据,然后请求使用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数据..我想知道如何将数据部分从Im发送而不破坏zlib压缩...因为目前当我将MethodResponseData提供给我的解压方法showen下面

- (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,而压缩仍然存在,所以我可以用我的方法进行解压缩。

回答

0

所以我设法改变我从数据获取字节的方式,我recive这个

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

这意味着没有馅与压缩不像以前格式化左右,然后我发现了另一个问题,与此代码

err = inflateInit2(&stream, -MAX_WBITS); 

线,所以我改回了原来的

err = inflateInit(&stream); 

,这一切都正确。