提问人:YosiFZ 提问时间:11/8/2023 最后编辑:YosiFZ 更新时间:11/13/2023 访问量:48
将图像文件转换为块中的 base64 字符串 Objective-c
Convert image file to base64 string in chunks Objective-c
问:
我有一个 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 链接到已加密的文件,也许这就是问题所在
答:
0赞
Cy-4AH
11/13/2023
#1
什么是chunkSize?Base64 以 4/3 四舍五入的方式增加原始大小。因此,如果您的 chunkSize 未被划分为 3,则结果将包含虚拟字符。为了避免结果中出现虚拟字符,您应该使用 chunkSize 可分为 3。
评论
value
base64EncodedString