美文网首页iOS 技术文档收录iOS Developer
标准Base64编码,URLSafe模式(OC,Android,

标准Base64编码,URLSafe模式(OC,Android,

作者: hnxyzhw | 来源:发表于2017-05-24 17:24 被阅读1500次

    在实际开发工作中,我们进行http数据请求传输时,有时候会用到Base64的编码格式,对参数进行重新编发.

    而Base64是将二进制转码成可见字符,从而方便我们在进行http请求时进行传输,但是Base64转码时会生成“+”,“/”,“=”符号,这些是被URL进行转码的特殊字符,这样就会导致两方面数据不一致,导致我们发送数据请求时,无法跟后台接口正确对接。

    因此我需要在发送前将“+”,“/”,“=”替换成URL不会转码的字符,接收到数据后,再将这些字符替换回去,再进行解码。

    OC中的处理方式:

    #pragma - 将Base64编码中的"-","_"字符串转换成"+","/",字符串长度余4倍的位补"="
    +(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
    {
        // '-' -> '+'
        // '_' -> '/'
        // 不足4倍长度,补'='
        NSMutableString * base64Str = [[NSMutableString alloc]initWithString:safeUrlbase64Str];
        base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
        base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
        NSInteger mod4 = base64Str.length % 4;
        if(mod4 > 0){
            [base64Str appendString:[@"====" substringToIndex(4-mod4)]];
          }
        NSLog(@"Base64 source str:%@", base64Str);
        return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];
    }
    
    #pragma - Base64编码中包含有"+,/,="不安全的URL字符串,我们要对这些字符进行转换
    +(NSString*)safeUrlBase64Encode:(NSData*)data
    {
        // '+' -> '-'
        // '/' -> '_'
        // '=' -> ''
        NSString * base64Str = [GTMBase64 stringByEncodingData:data];
        NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str];
        safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
        safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
        safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];
        NSLog(@"safeBase64编码:%@", safeBase64Str);
        return safeBase64Str;
    }
    

    Android中的处理方式:

    //Android话,android.utils.Base64自带该功能:
    Base64.encodeToString(encrypted, Base64.URL_SAFE|Base64.NO_WRAP);
    Base64.decode(data, Base64.URL_SAFE);
    

    Java中的处理方式:

    public static String safeUrlBase64Encode(byte[] data){
            String encodeBase64 = new BASE64Encoder().encode(data);
            String safeBase64Str = encodeBase64.replace('+', '-');
            safeBase64Str = safeBase64Str.replace('/', '_');
            safeBase64Str = safeBase64Str.replaceAll("=", "");
            return safeBase64Str;
    }
    public static byte[] safeUrlBase64Decode(final String safeBase64Str){
            String base64Str = safeBase64Str.replace('-', '+');
            base64Str = base64Str.replace('_', '/');
            int mod4 = base64Str.length()%4;
            if(mod4 > 0){
                base64Str = base64Str + "====".substring(mod4);
            }
            return new BASE64Decoder().decodeBuffer(base64Str);
    }
    

    PHP中的处理方式:

    /**
         * URL base64解码
         * '-' -> '+'
         * '_' -> '/'
         * 字符串长度%4的余数,补'='
         * @param unknown $string
         */
        public static function urlsafe_b64decode($string) {
            $data = str_replace(array('-','_'),array('+','/'),$string);
            $mod4 = strlen($data) % 4;
            if ($mod4) {
                $data .= substr('====', $mod4);
            }
            return base64_decode($data);
        }
    
        /**
         * URL base64编码
         * '+' -> '-'
         * '/' -> '_'
         * '=' -> ''
         * @param unknown $string
         */
        function urlsafe_b64encode($string) {
            $data = base64_encode($string);
            $data = str_replace(array('+','/','='),array('-','_',''),$data);
            return $data;
        }
    

    相关文章

      网友评论

        本文标题:标准Base64编码,URLSafe模式(OC,Android,

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