• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android android.util.Base64应用

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0630/559.html

 
android 开发中偶然会必要用到base64加解密,其实base64并不算是一种加密的算法,只是一种基于64个可打印字符来显露二进制数据的显露要领。
 
 
 
谷歌在android.util下供应了一个Base64对象类,可以很利便的用它encode和decode,内部供应要领如下
 
 
 
 
 
 
 
其中要紧说下几种多见的flags和其含义
 
 
 
flags 申明 注释
 
DEFAULT Default values for encoder/decoder flags. 默认模式
 
CRLF Encoder flag bit to indicate lines should be terminated with a CRLF pair instead of just an LF. 指导行的编码器标记位用CRLF替代LF
 
NO_CLOSE Flag to pass to Base64OutputStream to indicate that it should not close the output stream it is wrapping when it itself is closed. 传递给Base64OutputStream标记以指导它本身封闭时不应封闭它正在包装的输出流
 
NO_PADDING Encoder flag bit to omit the padding ‘=’ characters at the end of the output (if any). 不祥末尾添补的’='字符
 
NO_WRAP Encoder flag bit to omit all line terminators (i.e., the output will be on one long line). 不祥全部的停止符
 
URL_SAFE Encoder/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);
 
1
 
1
 
换成
 
 
 
android.util.Base64.encodeToString(input, Base64.NO_WRAP);
 
1
 
1
 
我们来写个简单的例子对比下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);
 
1
 
2
 
3
 
4
 
5
 
6
 
1
 
2
 
3
 
4
 
5
 
6
 
打印后果
 
 
 
相对付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;
 
1
 
1
 
以是测试后可发现,encode时应用非URL_SAFE ,可以通过底下方式解码
 
 
 
android.util.Base64.decode(input, Base64.DEFAULT);
 
1
 
1
 
而encode时应用URL_SAFE的,只能通过Base64.URL_SAFE解码
 
 
 
android.util.Base64.decode(input, Base64.URL_SAFE);
 
1
 
1
 
总结:
 
1.在android客户端里本人加解码,只要encode和decode应用对应的flag即可。encode时flag为Base64.URL_SAFE,decode的flag必须为Base64.URL_SAFE。
 
2.要是必要和第三方对接时,由于普通第三方http要求时会自动对参数和参数值urlencode 防止乱码,以是不必要再处分+等字符,干脆应用NO_WRAP来encode。要是是本人封装的http要求,没有对参数和参数值urlencode,则必要在要求时对参数和参数值urlencode下。
 

上篇:上一篇:Java若何举行Base64的编码(Encode)与解码(Decode)
下篇:下一篇:DES/ECB/PKCS5Padding 加密解密算法