更新4
根据Greg的建议,我创建了一对图像/文本,显示了从37k图像到base64编码的输出,使用100k块。由于文件只有37k,可以肯定地说循环只迭代了一次,因此没有添加任何内容。另一对显示了相同的37k图像到base64编码的输出,使用10k块。由于文件是37k,循环迭代了四次,数据肯定被添加了。
这是我的代码所在的位置。清理了一下,但仍然产生相同的效果:
所以看起来大于100 KB的文件会被破坏,但是小于100 KB的文件则没有问题。很明显,我的缓冲区/数学等有些问题,但是我在这个问题上迷失了方向。也许该结束一天了,但我想解决这个问题后再睡觉。
根据Greg的建议,我创建了一对图像/文本,显示了从37k图像到base64编码的输出,使用100k块。由于文件只有37k,可以肯定地说循环只迭代了一次,因此没有添加任何内容。另一对显示了相同的37k图像到base64编码的输出,使用10k块。由于文件是37k,循环迭代了四次,数据肯定被添加了。
对这两个文件进行差异比较,可以发现在10kb块文件中,从第214行开始到第640行结束有很大的区别。
更新3这是我的代码所在的位置。清理了一下,但仍然产生相同的效果:
// 从原始文件中分块读取数据 [originalFile seekToEndOfFile]; NSUInteger fileLength = [originalFile offsetInFile]; [originalFile seekToFileOffset:0]; NSUInteger chunkSize = 100 * 1024; NSUInteger offset = 0;更新2
while(offset < fileLength) { NSData *chunk = [originalFile readDataOfLength:chunkSize]; offset += chunkSize;
// 将块转换为base64编码的字符串,然后再转换回NSData NSString *base64EncodedChunkString = [chunk base64EncodedString]; NSData *base64EncodedChunk = [base64EncodedChunkString dataUsingEncoding:NSASCIIStringEncoding];
// 将编码后的块写入输出文件 [encodedFile writeData:base64EncodedChunk];
// 清理 base64EncodedChunkString = nil; base64EncodedChunk = nil;
// 更新进度条 [self updateProgress:[NSNumber numberWithInt:offset] total:[NSNumber numberWithInt:fileLength]]; }
所以看起来大于100 KB的文件会被破坏,但是小于100 KB的文件则没有问题。很明显,我的缓冲区/数学等有些问题,但是我在这个问题上迷失了方向。也许该结束一天了,但我想解决这个问题后再睡觉。
这里是一个例子:
更新1
经过测试,我发现同一段代码对于小图片没有问题,但是对于任何大小的大图片或视频都无法正常工作。显然这是一个缓冲问题,对吧?
嗨,我试图通过循环逐个小块进行base64编码来编码大文件,一切似乎都很顺利,但文件总是损坏。我想知道有谁能指出我哪里做错了:
NSFileHandle *originalFile, *encodedFile; self.localEncodedURL = [NSString stringWithFormat:@"%@-base64.xml", self.localURL];
// 打开原始文件以供读取 originalFile = [NSFileHandle fileHandleForReadingAtPath:self.localURL]; if (originalFile == nil) { [self performSelectorOnMainThread:@selector(updateStatus:) withObject:@"编码失败。" waitUntilDone:NO]; return; } encodedFile = [NSFileHandle fileHandleForWritingAtPath:self.localEncodedURL]; if (encodedFile == nil) { [self performSelectorOnMainThread:@selector(updateStatus:) withObject:@"编码失败。" waitUntilDone:NO]; return; }
// 从原始文件中以块的形式读取数据 [originalFile seekToEndOfFile]; NSUInteger length = [originalFile offsetInFile]; [originalFile seekToFileOffset:0]; NSUInteger chunkSize = 100 * 1024; NSUInteger offset = 0; do { NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset; NSData *chunk = [originalFile readDataOfLength:thisChunkSize]; offset += [chunk length];
NSString *base64EncodedChunkString = [chunk base64EncodedString]; NSData *base64EncodedChunk = [base64EncodedChunkString dataUsingEncoding:NSASCIIStringEncoding];
[encodedFile writeData:base64EncodedChunk];
base64EncodedChunkString = nil; base64EncodedChunk = nil;
} while (offset < length);