2013-07-23 2 views
0

Я пытаюсь сохранить размер файла в байтах как NSNumber. Я читаю размер загрузки файла из NSURLResponse, и это дает мне длинное длинное значение, и затем я создаю объект NSNumber из этого значения и сохраняю его. Когда я вернусь к этому значению позже, он возвращается со всеми более высокими байтами, установленными как FFFFFFFF.Objective C - NSNumber сохранение и получение longLongValue всегда префиксов с 0xFFFFFFFF

Например, я прочитал размер как 2196772870 байт (0x82f01806), а затем сохранил его в NSNumber. Когда я верну его, я получаю -2098194426 байт (0xffffffff82f01806). Я попытался сделать двоичный файл AND с 0x00000000FFFFFFFF перед сохранением значения в NSNumber, но он все равно возвращается как отрицательный. Код ниже:

long long bytesTotal = response.expectedContentLength; 
NSLog(@"bytesTotal = %llx",bytesTotal); 
[downloadInfo setFileTotalSize:[NSNumber numberWithInt:bytesTotal]]; 
//[downloadInfo setFileTotalSize:[NSNumber numberWithLongLong:bytesTotal]]; 
long long fileTotalSize = [[downloadInfo fileTotalSize] longLongValue];   
NSLog(@"fileTotalSize = %llx",fileTotalSize); 

Выходные:

bytesTotal = 82f01806 
fileTotalSize = ffffffff82f01806 

Любые предложения?

Редактировать: Полностью забыл установщик для объекта downloadInfo.

+0

Почему вы маскируете 'bytesTotal' при создании' size'? Что вы делаете с 'size'? Откуда появляется 'downloadInfo'? – rmaddy

+0

@maddy Он делает то же самое, маскирую ли я его или нет. downloadInfo - это просто объект, который сохраняет размер файла, чтобы я мог отображать общий размер в представлении. – rplankenhorn

+0

В коде, который вы отправили, есть большая дыра. Как вы попадаете из переменной 'size' (которую вы не регистрируете) в переменную' downloadInfo'? Мне кажется, что испорченное значение происходит где-то в этом недостающем наборе деталей. – rmaddy

ответ

1

Проблема эта линия:

[downloadInfo setFileTotalSize:[NSNumber numberWithInt:bytesTotal]]; 

bytesTotal не является int, это long long, так что вы должны использовать numberWithLongLong:, не numberWithInt:. Измените его на:

[downloadInfo setFileTotalSize:[NSNumber numberWithLongLong:bytesTotal]]; 

Конверсия, заставляя его быть знаком продлен до 64 бит, а число, начиная с 8-видимому, является отрицательным числом, так что бит получает расширенный весь путь через верхний длинный, в результате чего это будет ffffffff.

+0

Я по-прежнему вижу вопрос, использую ли я числоWithLongLong или numberWithInt. – rplankenhorn

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

  • Нет связанных вопросов^_^