2015-02-02 3 views
1

неявного преобразование теряет целочисленную точность: беззнаковая долго "до«UINT» (ака беззнакового INT ')неявного преобразования теряет целочисленную точность в методе сжатия ZLib

Я пытаюсь обновить приложение из 32 бит до 64 бит, поскольку при изменении архитектуры я получил ошибку, описанную выше.

У меня есть метод, который принимает NSData, который является сжатым zlib и возвращает распакованные данные.

Это метод.

- (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; // this is where the error happens the yellow triangle is under the "minus" - 
     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; 
} 

Я не уверен, как это исправить .. Я попытался ввести отливать Len используя (INT), однако это еще доза не работает.

Любая помощь будет оценена по достоинству.

ответ

3

Это не ошибка, это предупреждение. И если вы хотите, чтобы заставить замолчать его, вы можете просто бросить unsigned long часть своего выражения к unsigned int:

stream.avail_in = (uint)(len - stream.total_in); 

Предупреждение просто предупреждает вас о том, что ты превращаешься длинный в междунар, таким образом теряя точность; и поскольку вы явно не отдавали свой длинный код в int, ваш компилятор просто позволяет вам понять, что, возможно, вы теряете точность непреднамеренно.

+1

Чтобы добавить к этому, это предупреждение должно быть абсолютно безопасным, если вы работаете в <4 ГБ данных за раз. – StilesCrisis