iOS base64解码问题记录
2020-10-29 本文已影响0人
果哥爸
今天遇到一个Base64解码
的问题,因此在这里记录一下。
一. 问题
问题是这样,服务器下发的Base64
编码后的数据,iOS端
调用系统解码,解出来为空,但是安卓
或者web端
解析出来没问题。
NSString *token = @"eyJzdWIiOiJhYmM0IiwidWlkIjoyMTY0NzQ0LCJzY3AiOlsiUk9MRV9SRUdVTEFSIl0sIm5iZiI6MTYwMzY5Mjg5MywiaXNzIjoiaHR0cDpcL1wvMTkyLjE2OC4yLjk6ODA4NyIsImV4cCI6MTYwMzczNjA5MywiaWF0IjoxNjAzNjkyODkzLCJqdGkiOiJmNDcxOTAyMC0zMGRmLTQ1NDItYjEyMy04YWY0YTVlNDFmNDIifQ";
二. 问题原因
问题的原因在于后端下发的Base64编码
后的字符串,并没有严格按照Base64编码
的转化规则。
Base64编码原理:
1)将所有字符转化为ASCII码;
2)将ASCII码转化为8位二进制;
3)将3个8位二进制归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
4)统一在6位二进制前补两个0凑足8位;
5)将补0后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码;
处理过程说明:
a.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
b.数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
c.不断进行,直到全部输入数据转换完成。
d.如果最后剩下两个输入数据,在编码结果后加1个“=”;
e.如果最后剩下一个输入数据,编码结果后加2个“=”;
f.如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
也就是说后端下发的Base64编码
后的字符串将后面补位的=
去掉了,导致iOS
这边调用系统的Base64解码
方法解不出来,而安卓和web端的方法进行了兼容。
三. 解决方法
根据Base64编码
编码的原理(取3
个8
位的2进制
,转化为4
个6
位的2进制
),编码出来的字符串一定为4的倍数,因此在解码的时候,添加判断,获取到的字符串是否为4的整数倍,填充等号=
,使其变为4的倍数。
方法如下:
// Base64解码方法2
+ (NSString *)base64DecodingStringWithInputText:(NSString *)inputText {
NSInteger remainder = inputText.length % 4;
NSMutableString *tmpMstring = [[NSMutableString alloc] initWithString:inputText];
if (remainder > 0) {
for (; remainder < 4; remainder++) {
[tmpMstring appendString:@"="];
}
}
NSData *data = [[NSData alloc]initWithBase64EncodedString:tmpMstring options:0];
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}