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

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

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

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;

     }

OC:

 #pragma - 将saveBase64编码中的"-","_"字符串转换成"+","/",字符串长度余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 % ;

     if(mod4 > )

         [base64Str appendString:[@"====" substringToIndex:(-mod4)]];

     NSLog(@"Base64原文:%@", 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;

 }

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);

 }

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

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

URL安全的Base64编码,解码的更多相关文章

  1. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  2. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码, 1 1.1. 子模式 urlsafe Or  url  ...

  3. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url u ...

  4. 王小胖之 Base64编码/解码

    使用场景:编码网址作为URL参数,简单编码或加密数据,下载地址生成或解析. 实现功能:BASE64在线编码和解码. 数据实例:王小胖好啊,王小胖顶呱呱!! ~~ english 123 !@#$%^& ...

  5. OpenSSL 使用 base64 编码/解码

    简述 关于 OpenSSL 的介绍及安装请参见:Windows下编译OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #incl ...

  6. 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

  8. delphi Base64编码/解码及数据压缩/解压知识

    一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeD ...

  9. Code:Base64 编码/解码

    ylbtech-Code:Base64 编码/解码 1. C#返回顶部 1.编码 byte[] inArray = new byte[msgTxt.Length]; int x; ; x < m ...

  10. 原来浏览器原生支持JS Base64编码解码 outside of the Latin1 range

    原来浏览器原生支持JS Base64编码解码 « 张鑫旭-鑫空间-鑫生活 https://www.zhangxinxu.com/wordpress/2018/08/js-base64-atob-bto ...

随机推荐

  1. Windows环境下在sublime text3配置C编译环境

    1. 检查本机有没有安装GCC,没有的话先进行安装 2. 选择 sublime 的Tools->Build System->New Build System,建立配置文件,文件命名为C.s ...

  2. oracle入坑日记<三>用户详解(角色理解)

    1   用户是什么 1.1.权限管理是Oracle的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种.如果把Oracl ...

  3. [转]Python 的列表解析式,集合解析式,字典解析式

    Python 的列表解析式,集合解析式,字典解析式 这三种都是 python 里面的语法糖. 语法糖,Syntactic Sugar,就是为了写程序时候少出错,发明的一些简便的方法,但不影响这个语法的 ...

  4. python3 摘抄

    https://www.python.org/downloads/release/python-370/ python3.7.0 win10环境,选:Windows x86-64可执行安装程序. ht ...

  5. SoapUI 请求 https 报 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

    在 E:\ProgramFiles\SmartBear\SoapUI-Pro-5.1.2\bin\SoapUI-Pro-5.1.2.vmoptions 中添加一行代码,代码如下: -Dsoapui.h ...

  6. Maven项目强制更新,解决Failed to read artifact descriptor for xxx.jar问题

    导入的maven项目pom.xml现红叉 分析原因:在maven本地仓库中找不到相应的jar包. 解决方案:让maven强制更新依赖. 项目右击菜单,Maven -> Update Projec ...

  7. MySQL慢查询日志相关的文件配置和使用。

    MySQL慢查询日志提供了超过指定时间阈值的查询信息,为性能优化提供了主要的参考依据,是一个非常实用的功能,MySQL慢查询日志的开启和配置非常简单,可以指定记录的文件(或者表),超过的时间阈值等就可 ...

  8. jdk-8u181-docs.chm -- 制作时间2018年8月12日

    为了方便查阅,自己做了一个JDK8的chm文件:jdk-8u181-docs.chm    密码: g675 chm制作工具 :chmwriter 目录:

  9. Jquery通过AJAX从后台获取数据显示在表格上(复选)

    代码: function GetMultiLineSelectTable(tableId, selectIds) { var table = $(tableId); var url = table.d ...

  10. 使用dubbo中间件的zookeeper注册中心时报错

    在项目中搭建soa项目时,使用dubbo服务中间件时需要在虚拟机中创建一个zookeeper注册中心,在配置都没有问题的时候,如果服务端启动成功,但是消费端启动报错并且看不出据地位置时,一定要注意你的 ...