更新 4
根据 Greg 的建议,我创建了一对图像/文本,使用 100k 块显示从 37k 图像到 base64 编码的输出。由于文件只有 37k,可以肯定地说循环只迭代了一次,所以没有附加任何内容。另一对使用 10k 块显示从相同 37k 图像到 base64 编码的输出。由于文件为 37k,因此循环迭代了四次,并且肯定附加了数据。
对这两个文件进行比较表明,在 10kb 的块文件上,从第 214 行开始到第 640 行结束的差异很大。
- 小图像 (37k) - 100k 块 - 图像输出
- 小图像 (37k) - 100k 块 - Base64 文本输出
- 小图像 (37k) - 10k 块 - 图像输出
- 小图像 (37k) - 10k 块 - Base64 文本输出
更新 3
这是我的代码现在所在的位置。清理了一下,但仍然产生相同的效果:
// 从原始文件中分块读取数据
[原始文件 seekToEndOfFile];
NSUInteger fileLength = [originalFile offsetInFile];
[原始文件 seekToFileOffset:0];
NSUInteger 块大小 = 100 * 1024;
NSUInteger 偏移量 = 0;
而(偏移量<文件长度){
NSData *chunk = [originalFile readDataOfLength:chunkSize];
偏移量 += 块大小;
// 将块转换为 base64 编码的字符串并返回到 NSData
NSString *base64EncodedChunkString = [块 base64EncodedString];
NSData *base64EncodedChunk = [base64EncodedChunkString dataUsingEncoding:NSASCIIStringEncoding];
// 将编码后的块写入我们的输出文件
[encodedFile writeData:base64EncodedChunk];
// 清理
base64EncodedChunkString = nil;
base64EncodedChunk = nil;
// 更新进度条
[self updateProgress:[NSNumber numberWithInt:offset] total:[NSNumber numberWithInt:fileLength]];
}
更新 2
所以看起来大于 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:@"编码失败。" 等待直到完成:否];
返回;
}
encodedFile = [NSFileHandle fileHandleForWritingAtPath:self.localEncodedURL];
if (encodedFile == nil) {
[self performSelectorOnMainThread:@selector(updateStatus:) withObject:@"编码失败。" 等待直到完成:否];
返回;
}
// 从原始文件中分块读取数据
[原始文件 seekToEndOfFile];
NSUInteger 长度 = [originalFile offsetInFile];
[原始文件 seekToFileOffset:0];
NSUInteger 块大小 = 100 * 1024;
NSUInteger 偏移量 = 0;
做 {
NSUInteger thisChunkSize = 长度 - 偏移 > chunkSize ?chunkSize : 长度 - 偏移量;
NSData *chunk = [originalFile readDataOfLength:thisChunkSize];
偏移 += [块长度];
NSString *base64EncodedChunkString = [块 base64EncodedString];
NSData *base64EncodedChunk = [base64EncodedChunkString dataUsingEncoding:NSASCIIStringEncoding];
[encodedFile writeData:base64EncodedChunk];
base64EncodedChunkString = nil;
base64EncodedChunk = nil;
} 而(偏移量 < 长度);