2015-06-10 29 views
0

我只是更新我的一个应用程序,我的解压方法出错。Zlib解压缩方法警告使用ios 64位体系结构

这是我遇到

Implicit conversion loses integer precision: 'unsigned long' to 'unit' (aka 'unsigned int') 

警告这是代码及其对

stream.avail_in = len - stream.total_in; 

发生线路,这是整个方法看起来像

#pragma mark - ZLib Compression Methods 
// Returns the decompressed version if the zlib compressed input data or nil if there was an error 
- (NSData*) dataByDecompressingData:(NSData*)data { 

    NSLog(@"%lu", (unsigned long)data.length); 

    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); 
    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; 
} 
+0

警告!=错误(虽然它*可能是一个指标) - 但是..它是否“工作”? – user2864740

回答

1

首先,你不应该使用stream.total_in。它可能会或可能不是您的应用程序的足够大的类型。它始终是unsigned long。根据您的应用使用您自己的总计输入计数器,并忽略stream.total_in

其次,我猜你的CHECK_ERR()以某种方式中止。您不应该在Z_BUF_ERROR事件中放弃。在这种情况下,您可以继续简单地提供更多的输入和/或更多的输出空间。

第三,这里的问题是,你需要选择一个stream.avail_in,这是确保适合unsigned。您应该将剩余输入的数量与最大值unsigned进行比较,例如UINT_MAX(unsigned)0 - 1。如果剩余数据较大,请使用最大值并从剩余输入中扣除。如果小于或等于,则全部使用它,并将剩余的输入设置为零。