zoukankan      html  css  js  c++  java
  • URL安全的Base64编码,解码

    Base64 可以将二进制转码成可见字符方便进行http传输,但是base64转码时会生成“+”,“/”,“=”这些被URL进行转码的特殊字符,导致两方面数据不一致。

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

    Base64加密转换原理与代码实现 :http://www.cnblogs.com/jxust-jiege666/p/8590116.html

    PHP:

     1     /**
     2 
     3      * URL base64解码
     4 
     5      * '-' -> '+'
     6 
     7      * '_' -> '/'
     8 
     9      * 字符串长度%4的余数,补'='
    10 
    11      * @param unknown $string
    12 
    13      */
    14 
    15     public static function urlsafe_b64decode($string) {
    16 
    17         $data = str_replace(array('-','_'),array('+','/'),$string);
    18 
    19         $mod4 = strlen($data) % 4;
    20 
    21         if ($mod4) {
    22 
    23             $data .= substr('====', $mod4);
    24 
    25         }
    26 
    27         return base64_decode($data);
    28 
    29     }
    30 
    31     
    32 
    33     /**
    34 
    35      * URL base64编码
    36 
    37      * '+' -> '-'
    38 
    39      * '/' -> '_'
    40 
    41      * '=' -> ''
    42 
    43      * @param unknown $string
    44 
    45      */
    46 
    47     function urlsafe_b64encode($string) {
    48 
    49         $data = base64_encode($string);
    50 
    51         $data = str_replace(array('+','/','='),array('-','_',''),$data);
    52 
    53         return $data;
    54 
    55     }

    OC:

     1 #pragma - 将saveBase64编码中的"-","_"字符串转换成"+","/",字符串长度余4倍的位补"="
     2 
     3 +(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
     4 
     5 {
     6 
     7     // '-' -> '+'
     8 
     9     // '_' -> '/'
    10 
    11     // 不足4倍长度,补'='
    12 
    13     NSMutableString * base64Str = [[NSMutableString alloc]initWithString:safeUrlbase64Str];
    14 
    15     base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
    16 
    17     base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
    18 
    19     NSInteger mod4 = base64Str.length % 4;
    20 
    21     if(mod4 > 0)
    22 
    23         [base64Str appendString:[@"====" substringToIndex:(4-mod4)]];
    24 
    25     NSLog(@"Base64原文:%@", base64Str);
    26 
    27     return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];
    28 
    29     
    30 
    31 }
    32 
    33  
    34 
    35 #pragma - 因为Base64编码中包含有+,/,=这些不安全的URL字符串,所以要进行换字符
    36 
    37 +(NSString*)safeUrlBase64Encode:(NSData*)data
    38 
    39 {
    40 
    41     // '+' -> '-'
    42 
    43     // '/' -> '_'
    44 
    45     // '=' -> ''
    46 
    47     NSString * base64Str = [GTMBase64 stringByEncodingData:data];
    48 
    49     NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str];
    50 
    51     safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
    52 
    53     safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
    54 
    55     safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];
    56 
    57     NSLog(@"safeBase64编码:%@", safeBase64Str);
    58 
    59     return safeBase64Str;
    60 
    61 }

    Java:

     1 public static String safeUrlBase64Encode(byte[] data){
     2 
     3 String encodeBase64 = new BASE64Encoder().encode(data);
     4 
     5 String safeBase64Str = encodeBase64.replace('+', '-');
     6 
     7 safeBase64Str = safeBase64Str.replace('/', '_');
     8 
     9 safeBase64Str = safeBase64Str.replaceAll("=", "");
    10 
    11 return safeBase64Str;
    12 
    13 }
    14 
    15  
    16 
    17 public static byte[] safeUrlBase64Decode(final String safeBase64Str){
    18 
    19 String base64Str = safeBase64Str.replace('-', '+');
    20 
    21 base64Str = base64Str.replace('_', '/');
    22 
    23 int mod4 = base64Str.length()%4;
    24 
    25 if(mod4 > 0){
    26 
    27 base64Str = base64Str + "====".substring(mod4);
    28 
    29 }
    30 
    31 return new BASE64Decoder().decodeBuffer(base64Str);
    32 
    33 }
    34 
    35  

    如果是Android的话,android.utils.Base64自带该功能:

    1 Base64.encodeToString(encrypted, Base64.URL_SAFE|Base64.NO_WRAP)
    2 Base64.decode(data, Base64.URL_SAFE);



  • 相关阅读:
    数据恢复与硬盘数据结构
    Add dynamic tooltips to buttons in dialog(转)
    Visual C++ 2008资源全搜罗(转)
    (转)学习数据恢复(四)
    如何开启Vista Aero效果
    硬盘FAT文件系统原理的详细分析
    web form弹出提示框
    WIN32_FIND_DATA and CFileFind
    编程老手与高手的误区
    (转)解读NTFS(三)
  • 原文地址:https://www.cnblogs.com/jxust-jiege666/p/8733204.html
Copyright © 2011-2022 走看看