我有一个objective-c项目,其中有一个图像文件,我想将其转换为base64字符串,我不想先将其转换为NSData然后使用
base64EncodedStringWithOptions
,我想逐块读取文件。所以我创建了这个方法:
-(NSString*) base64EncodeFileAtPath:(NSURL*)url with:(NSUInteger)chunkSize {
NSMutableString *base64EncodedString = [[NSMutableString alloc] init];
NSString * t = [url.absoluteString stringByReplacingOccurrencesOfString:@"encrypted-file://" withString:@""];
NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:t];
if (!inputStream) {
NSLog(@"Unable to create input stream from file");
return nil;
}
[inputStream open];
@try {
uint8_t *buffer = (uint8_t *)malloc(sizeof(uint8_t) * chunkSize);
while ([inputStream hasBytesAvailable]) {
@autoreleasepool {
NSInteger bytesRead = [inputStream read:buffer maxLength:chunkSize];
if (bytesRead < 0) {
NSError *readError = [inputStream streamError];
if (readError) {
NSLog(@"Stream read error: %@", readError);
}
break;
}
NSData *dataBuffer = [NSData dataWithBytes:buffer length:bytesRead];
NSString *base64Chunk = [dataBuffer base64EncodedStringWithOptions:0];
[base64EncodedString appendString:base64Chunk];
}
}
free(buffer);
}
@finally {
[inputStream close];
}
return base64EncodedString;
}
这就是我调用该方法的方式:
[self base64EncodeFileAtPath:fileURL with:10 * 3600];
问题是,当我想将文件解码回图像时,我得到一个空图像,所以我认为编码已损坏,因为当我使用时:
NSData* data = [[NSData alloc] initWithContentsOfURL:fileURL];
NSString * value = [data base64EncodedStringWithOptions:0];
一切都很好,知道可能是什么问题吗?
编辑
fileUrl 链接到一个已加密的文件,也许这就是问题所在
什么是 chunkSize? Base64 按 4/3 向上舍入增加原始大小。因此,如果您的 chunkSize 未除以 3,结果将包含虚拟字符。为了避免结果中出现虚拟字符,您应该使用可整除 3 的 chunkSize。