更新 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; } 而(偏移量 < 长度);