2015-06-10 1 views
0

Я просто обновляю одно из своих приложений, и у меня есть ошибка с моим методом декомпрессии.Предупреждение о методе декомпрессии Zlib с использованием архитектуры ios 64bit Архитектура

Это предупреждение, которое я испытываю

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.

Во-вторых, я предполагаю, что ваш прерывается как-то. Вы не должны прерываться в случае Z_BUF_ERROR. В этом случае вы можете продолжить, просто предоставив больше ввода и/или большего объема вывода.

В-третьих, проблема в том, что вам нужно выбрать stream.avail_in, который гарантированно соответствует unsigned. Вы должны сравнить количество оставшегося ввода с наибольшим значением unsigned, например. UINT_MAX или (unsigned)0 - 1. Если оставшиеся данные больше, используйте максимальное значение и вычитайте это из оставшегося ввода. Если это меньше или равно, используйте все это и установите оставшийся вход в ноль.

Смежные вопросы