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编码编码的原理(取38位的2进制,转化为46位的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];
}
上一篇下一篇

猜你喜欢

热点阅读