我正在尝试将以字节为单位的文件大小存储为NSNumber。我正在从NSURLResponse读取文件下载大小,这给了我一个长-长的值,然后我根据该值创建一个NSNumber对象并存储它。当我稍后检索该值时,它会返回,所有较高的字节都设置为FFFFFFFF。
例如,我读取2196772870字节(0x82f01806)的大小,然后将其存储到NSNumber中。当我把它拿回来时,我得到了2098194426字节(0xffffff82f01806)。在将值存储在NSNumber中之前,我尝试用0x00000000FFFFFFFF进行二进制AND运算,但结果仍然为负数。以下代码:
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。
问题是这一行:
[downloadInfo setFileTotalSize:[NSNumber numberWithInt:bytesTotal]];
bytesTotal
不是int
,而是long long
,所以应该使用numberWithLongLong:
,而不是numberWithInt:
。更改为:
[downloadInfo setFileTotalSize:[NSNumber numberWithLongLong:bytesTotal]];
转换导致它被符号扩展到64位,而以8开头的数字似乎是负数,因此该位一直扩展到上长,导致它成为ffffffff。