android.util.Base64使用

Android android.util.Base64使用

android 开发中有时会需要用到base64,首先说明base64是一种基于64个可打印字符来表示二进制数据的表示方法。

google在android.util下提供了一个Base64工具类,可以很方便的用它encode和decode,里面提供方法如下

在这里插入图片描述

其中主要说下几种常见的flags和其含义

flags说明注释
DEFAULTDefault values for encoder/decoder flags.默认模式
CRLFEncoder flag bit to indicate lines should be terminated with a CRLF pair instead of just an LF.指示行的编码器标志位用CRLF替代LF
NO_CLOSEFlag to pass to Base64OutputStream to indicate that it should not close the output stream it is wrapping when it itself is closed.传递给Base64OutputStream标记以指示它本身关闭时不应关闭它正在包装的输出流
NO_PADDINGEncoder flag bit to omit the padding ‘=’ characters at the end of the output (if any).省略末尾填充的’='字符
NO_WRAPEncoder flag bit to omit all line terminators (i.e., the output will be on one long line).省略所有的终止符
URL_SAFEEncoder/decoder flag bit to indicate using the “URL and filename safe” variant of Base64 (see RFC 3548 section 4) where - and _ are used in place of + and /.URL和文件名安全方式,替换其中不符合url安全的字符如+和/

需要注意的是,在android.util.Base64源码 发现Encoder有以下一行注释
在这里插入图片描述
大意就是**超过76字符就会自动换一行**
在对接其他平台时,有些平台使用的base64对换行后的字符串不一定能正确decode,所以需要

android.util.Base64.encodeToString(input, Base64.DEFAULT);

换成

android.util.Base64.encodeToString(input, Base64.NO_WRAP);

我们来写个简单的例子对比下DEFAULT、NO_PADDING、NO_WRAP和URL_SAFE,看看这几种区别

String str = "qwertyuiopasdfghjklzxcvbnm0123456789~!@#$%^&*()_+`¥……——+|《》?,./城市 姓名";
byte[] byteStr = str.getBytes("utf-8");
String encode_DEFAULT = Base64.encodeToString(byteStr,Base64.DEFAULT);
String encode_NO_PADDING = Base64.encodeToString(byteStr,Base64.NO_PADDING);
String encode_NO_WRAP = Base64.encodeToString(byteStr,Base64.NO_WRAP);
String encodeURL_SAFE = Base64.encodeToString(byteStr,Base64.URL_SAFE);

打印结果
在这里插入图片描述
相对于DEFAULT比较,我们可以看见
NO_PADDING只是将末尾自动补全的=号去除了
NO_WRAP去除了换行,输出始终为一整行
URL_SAFE将结果中的+变成-

将这几个结果放在在线Base64工具里面解码,只有URL_SAFE不能正常解码,会失败或者出现乱码,其余的都可以正常解码。查看android.util.Base64源码 ,发现android Base64工具里面decode时只有区分URL_SAFE和其他

((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE;

所以测试后可发现,encode时使用非URL_SAFE ,可以通过下面方式解码

android.util.Base64.decode(input, Base64.DEFAULT);

而encode时使用URL_SAFE的,只能通过Base64.URL_SAFE解码

android.util.Base64.decode(input, Base64.URL_SAFE);

总结:
1.在android客户端里自己加解码,只要encode和decode使用对应的flag即可。encode时flag为Base64.URL_SAFE,decode的flag必须为Base64.URL_SAFE。
2.如果需要和第三方对接时,因为一般第三方http请求时会主动对参数和参数值urlencode 防止乱码,所以不需要再处理+等字符,直接使用NO_WRAP来encode。如果是自己封装的http请求,没有对参数和参数值urlencode,则需要在请求时对参数和参数值urlencode下。


参考链接
https://developer.android.com/reference/android/util/Base64
https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/util/Base64.java

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值