2013-07-23 33 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对象的setter。

+0

为什么在创建size时屏蔽'bytesTotal'?你如何处理'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

我仍然看到我使用numberWithLongLong或numberWithInt的问题。 – rplankenhorn