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

Convert image file to base64 string in chunks Objective-c

提问人:YosiFZ 提问时间:11/8/2023 最后编辑:YosiFZ 更新时间:11/13/2023 访问量:48

问:

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

目标-C Base64

评论

0赞 Larme 11/8/2023
如果比较&,它们相差多少?尝试只输出前 n 个字符,然后去一个?valuebase64EncodedString
0赞 YosiFZ 11/9/2023
@Larme好主意!两者之间是有区别的,新函数的大小为 76568,base64EncodedStringWithOptions 的大小为 76544。知道是什么原因导致的吗?
1赞 Larme 11/9/2023
你如何解码?与 base64 编码一样,可能会插入新行(取决于大小)、填充等。如果你逐个比较内容,它从哪里开始不同?

答:

0赞 Cy-4AH 11/13/2023 #1

什么是chunkSize?Base64 以 4/3 四舍五入的方式增加原始大小。因此,如果您的 chunkSize 未被划分为 3,则结果将包含虚拟字符。为了避免结果中出现虚拟字符,您应该使用 chunkSize 可分为 3。