我有一个脚本将文件分成10MB块。在我尝试在6GB文件上执行此操作之前,此脚本没有问题。即使它们是uint64_t,也会在范围上获得负值。关于错误在哪里的任何建议?
NSData *conData = [NSURLConnection sendSynchronousRequest:fileSizeRequest returningResponse:&response error:&error];
if (conData)
{
NSDictionary *headers = [response allHeaderFields];
NSString *fileSizeString = [headers objectForKey:@"Content-Length"];
uint64_t fileSize = strtoull([fileSizeString UTF8String], NULL, 0);
self.size += fileSize;
uint64_t amountOfRanges = fileSize / 10485760;
for (int i = 0; i <= amountOfRanges; i++)
{
uint64_t rangeMin = 0;
uint64_t rangeMax = 0;
if (i != amountOfRanges)
{
rangeMin = i * 10485760;
rangeMax = (i + 1) * 10485760 - 1;
}
else
{
if (i == 0)
{
rangeMin = 0;
rangeMax = fileSize - 1;
}
else
{
rangeMin = i * 10485760;
rangeMax = i * 10485760 - 1 + (fileSize - rangeMin);
}
}
}
}
答案 0 :(得分:3)
您遇到以下表达式的问题:
rangeMin = i * 10485760;
请注意,i
是int
而10485760
是int
字面值,因此生成的int
表达式很容易溢出。理想情况下,您应该使i
成为uint64_t
和/或使用unsigned long long
文字,例如
rangeMin = i * 10485760ULL;