美文网首页
iOS base64解码问题记录

iOS base64解码问题记录

作者: 果哥爸 | 来源:发表于2020-10-29 22:38 被阅读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];
    }
    

    相关文章

      网友评论

          本文标题:iOS base64解码问题记录

          本文链接:https://www.haomeiwen.com/subject/rrzlvktx.html