起因:在做项目读取身份证图片时候接口返回base64数据,安卓转换正常,ios转换失败。
代码: 转换结果nil
NSData *photoData = [[NSData alloc] initWithBase64EncodedString:base64Str options:NSDataBase64DecodingIgnoreUnknownCharacters];
分析:
根据苹果文档说明base64的格式可能不合规。base64的规则是把原来规则数据8字节取出6个,然后再前面补00,形成新的8字节数据。如果最后不足6个字节呢,那么就用00补全后面,称为pad,表示为“=”,所以也是为什么base64字串后面会出现1~2个=的原因。由此可见,应该是后台传回数据时候自动去掉了pad,由于base64最终字串肯定是4的倍数,所以只要补全足够的=即可。
/* Create an NSData from a Base-64 encoded NSString using the given options. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
处理:
if (base64Str.length % 4 != 0) {
length = base64Str.length + 4 - (base64Str.length % 4);
base64Str = [base64Str stringByPaddingToLength:length withString:@"=" startingAtIndex:0];
}
NSData *photoData = [[NSData alloc] initWithBase64EncodedString:base64Str options:NSDataBase64DecodingIgnoreUnknownCharacters];
网友评论