Обновление 4
По предложению Грега я создал одну пару изображения / текста, которая показывает вывод изображения 37 КБ в кодировке base64 с использованием 100 КБ. куски. Поскольку размер файла составляет всего 37 КБ, можно с уверенностью сказать, что цикл повторяется только один раз, поэтому ничего не было добавлено. Другая пара показывает вывод того же изображения 37k в кодировке base64 с использованием 10k фрагментов. Поскольку размер файла составляет 37 КБ, цикл повторяется четыре раза, и данные определенно добавляются.
Выполнение сравнения двух файлов показывает, что в файле фрагментов размером 10 КБ есть большая разница, которая начинается в строке 214 и заканчивается в строке 640.
Обновление 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]]; }
Обновление 2
Таким образом, похоже, что файлы размером более 100 КБ зашифрованы, а файлы размером менее 100 КБ - в порядке. Очевидно, что что-то не так в моем буфере / математике / и т. Д., Но я потерялся в этом. Может быть, настало время назвать это днем, но я бы хотел спать, пока этот вопрос решен.
Вот пример:
Обновление 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);