将图像文件转换为块中的base64字符串 Objective-c

问题描述 投票:0回答:1

我有一个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 链接到一个已加密的文件,也许这就是问题所在

objective-c base64
1个回答
0
投票

什么是 chunkSize? Base64 按 4/3 向上舍入增加原始大小。因此,如果您的 chunkSize 未除以 3,结果将包含虚拟字符。为了避免结果中出现虚拟字符,您应该使用可整除 3 的 chunkSize。

© www.soinside.com 2019 - 2024. All rights reserved.