Chunks Update 4
suggestion par Greg J'ai créé une paire de texte/image qui montre la sortie d'une image 37k à base64, en utilisant des morceaux 100k. Puisque le fichier est seulement 37k, il est prudent de dire que la boucle ne s'est répétée qu'une seule fois, donc rien n'a été ajouté. L'autre paire montre la sortie de la même image 37k à base64 codée, en utilisant des morceaux de 10k. Puisque le fichier est 37k, la boucle a été répétée quatre fois, et les données ont été définitivement ajoutées.base64 Encode fichier à l'aide NSData
Faire un diff sur les deux fichiers montre que sur le fichier de morceau de 10kb il y a une grande différence qui commence sur la ligne 214 et se termine sur la ligne 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
Mise à jour 3
Voici où est mon code maintenant. Nettoyé un peu, mais en produisant le même effet:
// 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]]; }
Mise à jour 2
Il semble donc que les fichiers qui sont plus de 100 KB se brouillées, mais les fichiers sous 100 KB sont très bien. Il est évident que quelque chose ne marche pas sur mon buffer/math/etc, mais je suis perdu sur celui-ci. Peut-être le temps de l'appeler un jour, mais j'aimerais aller dormir avec celui-ci résolu.
Voici un exemple:
Mise à jour 1
Après avoir fait quelques tests que j'ai trouvé que le même code fonctionne très bien pour une petite image, mais ne fonctionnera pas pour une grande image ou vidéo n'importe quelle taille. Vraiment ressemble à un problème de tampon, non? Hé là, essayant de coder en base64 un gros fichier en faisant une boucle et en faisant un petit morceau à la fois. Tout semble fonctionner mais les fichiers finissent toujours corrompus. J'étais curieux de savoir si quelqu'un pouvait indiquer où je pourrais aller mal ici:
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);
De quelle façon est la sortie corrompue? – Greg
Pour les images (JPEG) et les vidéos (Quicktime), les fichiers sont illisibles. – frsh
Ce qui me porte à croire qu'il y a quelque chose qui ne va pas avec mon offset. Lorsque j'utilise la même catégorie base64 sur NSData sans la diviser en morceaux, cela fonctionne très bien. – frsh