Base64Encode文件使用NSData块
-
27-09-2019 - |
题
更新4
每Greg的建议,我已经创建了一个对图像/文本,显示出从37k图像base64编码,使用100k块。由于该文件仅仅是37k它是安全的说循环只能重复一次,所以没有什么是追加。其他对显示出从相同的37k图像base64编码,使用10公里的区块。由于文件是37k的循环重复四次,数据肯定是附加。
做一个差异,在这两个文件显示,在10kb块的文件有差别很大,开始在线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
因此它看起来像文件超过100KB得到扰,但下的文件100KB的罚款。这是显而易见的,事情是关于我的缓冲器/数学/等,但我失去了这一点。也许是时候叫它一天,但我想去睡觉用这一得到解决。
这里有一个例子:
1更新
后做一些测试中,我们发现,同样的代码会工作的现对于一个小的图像,而是将无法工作的大图片或视频的任大小。肯定看起来像一个缓冲区的问题,对吗?
嘿,试图base64encode一个大型文件的循环,通过这样做的一个小区块的时间。似乎一切都工作,但该文件总结了损坏。我很好奇如果任何人都可以指出在哪里我可能会走错了这里:
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);
解决方案
我希望我能给信贷GregInYEG,因为他的原始点有关填充物的潜在问题。与base64,每个区块必须是多3。因此,这解决了问题:
chunkSize = 3600
一旦我不得不说,腐败走了。但是然后我跑到内存渗漏的问题,所以我加了自动释放游泳池路从这个员额: http://www.cocoadev.com/index.pl?ReadAFilePieceByPiece
最后码:
// Read data in chunks from the original file
[originalFile seekToEndOfFile];
NSUInteger fileLength = [originalFile offsetInFile];
[originalFile seekToFileOffset:0];
// For base64, each chunk *MUST* be a multiple of 3
NSUInteger chunkSize = 24000;
NSUInteger offset = 0;
NSAutoreleasePool *chunkPool = [[NSAutoreleasePool alloc] init];
while(offset < fileLength) {
// Read the next chunk from the input file
[originalFile seekToFileOffset:offset];
NSData *chunk = [originalFile readDataOfLength:chunkSize];
// Update our offset
offset += chunkSize;
// Base64 encode the input chunk
NSData *serializedChunk = [NSPropertyListSerialization dataFromPropertyList:chunk format:NSPropertyListXMLFormat_v1_0 errorDescription:NULL];
NSString *serializedString = [[NSString alloc] initWithData:serializedChunk encoding:NSASCIIStringEncoding];
NSRange r = [serializedString rangeOfString:@"<data>"];
serializedString = [serializedString substringFromIndex:r.location+7];
r = [serializedString rangeOfString:@"</data>"];
serializedString = [serializedString substringToIndex:r.location-1];
// Write the base64 encoded chunk to our output file
NSData *base64EncodedChunk = [serializedString dataUsingEncoding:NSASCIIStringEncoding];
[encodedFile truncateFileAtOffset:[encodedFile seekToEndOfFile]];
[encodedFile writeData:base64EncodedChunk];
// Cleanup
base64EncodedChunk = nil;
serializedChunk = nil;
serializedString = nil;
chunk = nil;
// Update the progress bar
[self updateProgress:[NSNumber numberWithInt:offset] total:[NSNumber numberWithInt:fileLength]];
// Drain and recreate the pool
[chunkPool release];
chunkPool = [[NSAutoreleasePool alloc] init];
}
[chunkPool release];
其他提示
你是如何转换回base64数据的图像?一些实施中的限制的最大的线的长度,他们将接受。试着插入一条线打破每一个这么多人物。
不隶属于 StackOverflow