Update 4
предложения Per Грега Я создал одну пару изображений/текста, который показывает выход из 37k изображений в base64 кодированного, используя 100k ломтей. Так как файл всего 37k, можно с уверенностью сказать, что цикл повторяется только один раз, поэтому ничего не было добавлено. Другая пара показывает результат с одного и того же изображения 37k на base64, с использованием 10k кусков. Так как файл равен 37k, цикл повторяется четыре раза, и данные были определенно добавлены.Base64 Encode файл Использование NSData Куски
Выполнение диф на двух файлов показывает, что в файле 10kb куска есть большая разница, которая начинается на линии 214 и заканчивается на линии 640.
- Small Image (37k) - 100k Chunks - Image output
- Small Image (37k) - 100k Chunks - Base64 Text output
- Small Image (37k) - 10k Chunks - Image output
- Small Image (37k) - 10k Chunks - Base64 Text output
Обновление 3
Вот где мой код сейчас. Вымытый немного, но по-прежнему производит тот же эффект:
// Read data in chunks from the original file [originalFile seekToEndOfFile]; NSUInteger fileLength = [originalFile offsetInFile]; [originalFile seekToFileOffset:0]; NSUInteger chunkSize = 100 * 1024; NSUInteger offset = 0; while(offset < fileLength) { NSData *chunk = [originalFile readDataOfLength:chunkSize]; offset += chunkSize; // Convert the chunk to a base64 encoded string and back into NSData NSString *base64EncodedChunkString = [chunk base64EncodedString]; NSData *base64EncodedChunk = [base64EncodedChunkString dataUsingEncoding:NSASCIIStringEncoding]; // Write the encoded chunk to our output file [encodedFile writeData:base64EncodedChunk]; // Cleanup base64EncodedChunkString = nil; base64EncodedChunk = nil; // Update progress bar [self updateProgress:[NSNumber numberWithInt:offset] total:[NSNumber numberWithInt:fileLength]]; }
Update 2
Так это выглядит как файлы, размер которых превышает 100 КБ получить яичницу, но файлы в 100 килобайт в порядке. Очевидно, что что-то отключено в моем буфере/математике/и т. Д., Но я потерялся на этом. Возможно, настало время назвать это днем, но я бы с удовольствием заснул с этим решением.
Вот пример:
Update 1
После выполнения некоторого тестирования я обнаружил, что тот же самый код будет работать нормально для маленького изображения, но не будет работать для большого изображения или видео любого размера. Определенно выглядит проблема с буфером, не так ли?
Эй там, пытаясь base64 кодирования большого файла с помощью цикла через и делать это один небольшой кусок за один раз. Кажется, что все работает, но файлы всегда повреждены. Мне было интересно, если кто-нибудь может указать, где я мог бы идти неправильно здесь:
NSFileHandle *originalFile, *encodedFile; self.localEncodedURL = [NSString stringWithFormat:@"%@-base64.xml", self.localURL]; // Open the original file for reading originalFile = [NSFileHandle fileHandleForReadingAtPath:self.localURL]; if (originalFile == nil) { [self performSelectorOnMainThread:@selector(updateStatus:) withObject:@"Encoding failed." waitUntilDone:NO]; return; } encodedFile = [NSFileHandle fileHandleForWritingAtPath:self.localEncodedURL]; if (encodedFile == nil) { [self performSelectorOnMainThread:@selector(updateStatus:) withObject:@"Encoding failed." waitUntilDone:NO]; return; } // Read data in chunks from the original file [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);
Каким образом испорченный выход? – Greg
Для изображений (JPEG) и видео (Quicktime) файлы не читаются. – frsh
Что побуждает меня поверить, что что-то не так с моим смещением. Когда я использую ту же категорию base64 в NSData, не разбивая ее на куски, она работает нормально. – frsh