Файл кодирования Base64 с использованием блоков NSData

Обновление 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);

8
задан frsh 5 October 2010 в 19:27
поделиться