一、使用场景
文件不太大时,转为base64字符串进行传输。文件太大会造成效率上的问题,具体多大不知道,文件大建议用stream。
二、刨根问底
1、定义
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一将二进制序列转为人类可读的ASCII字符序列。常用在需用通过文本协议(如HTTP和SMTP)来传输二进制数据的情况下。俩作用:1)在HTTP环境下传输较长的标识信息。2)很弱的加密(常常需要把二进制数据编码为适合放在URL中的形式,此时Base64所编码的数据不会被人用肉眼所直接看到)。
2、为什么叫Base64?
使用A--Z,a--z,0--9,+,/ 这64个字符编码。
3、编码原理:
将3个字节转换成4个字节:先读入3个字节,每读一个字节,左移8位,再右移4次,每次6位,这样就有4个字节了,这样还不能保证得到的字符都是可见字符,为了到达此目的,Base64制定了一个编码表,进行统一的转换。当剩下的字符数量不足3个字节时,则使用0进行填充,相应的,输出字符则使用‘=’占位,因此编码后输出的文本末尾可能会出现1至2个‘=’。解码原理是将4个字节转换成3个字节,先读入4个6位,每次左移6位,再右移3次,每次8位,这样就还原了。
三、实践
1、将文件编码为Base64字符串
public static String encodeBase64File(String path) throws Exception {
<span style="white-space:pre"> </span>File file = new File(path);
<span style="white-space:pre"> </span>FileInputStream inputFile = new FileInputStream(file);
<span style="white-space:pre"> </span>byte[] buffer = new byte[(int)file.length()];
<span style="white-space:pre"> </span>inputFile.read(buffer);
inputFile.close();
return Base64.encodeToString(buffer,Base64.DEFAULT);
}
2、将Base64字符串解码保存到文件
public static void decoderBase64File(String base64Code,String savePath) throws Exception {
<span style="white-space:pre"> </span>byte[] buffer =Base64.decode(base64Code, Base64.DEFAULT);
<span style="white-space:pre"> </span>FileOutputStream out = new FileOutputStream(savePath);
<span style="white-space:pre"> </span>out.write(buffer);
<span style="white-space:pre"> </span>out.close();
}
3、将图片转为Base64
public static String getBitmapByte(Bitmap bitmap){
bitmap = compressImage(bitmap);
ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
return Base64.encodeToString(out.toByteArray(), Base64.DEFAULT);
}