0

我正在尝试将文件大小以字节为单位存储为 NSNumber。我正在从 NSURLResponse 读取文件下载大小,这给了我一个 long long 值,然后我从该值创建一个 NSNumber 对象并存储它。当我稍后去检索该值时,它会返回所有设置为 FFFFFFFF 的更高字节。

例如,我读入大小为 2196772870 字节(0x82f01806),然后将其存储到 NSNumber 中。当我取回它时,我得到 -2098194426 字节(0xffffffff82f01806)。在将值存储在 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 对象的设置器。

4

1 回答 1

1

问题是这一行:

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

bytesTotal不是一个int,它是一个long long,所以你应该使用numberWithLongLong:,不是numberWithInt:。将其更改为:

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

转换导致它被符号扩展为 64 位,并且以 8 开头的数字似乎是一个负数,因此该位一直延伸到高位 long,导致它是 ffffffff。

于 2013-07-23T20:10:22.520 回答