1. 什么是base64
base64是一种使用64个可读字符的一种编码方式 64个字符如下: (a~z)26个小写字母 (A~Z)26 +:加号 /:斜杠
2. base64原理
首先说说相关编码位数:Hex(十六进制)以4位为一组,而base64以6位为一组 这里的位指的是二进制位
base64将三个字符(3*8位)转化为4个字符(4*6位),文本不足3个字符,对转化6位字符后,后面的剩余的二进制位可能是2位或者4位(因为8X/6余数为2或者4),然后进行补0(补到一共6位,因为base64是以6位为单位)。最后还需加=号,缺少2个二进制位就补一个=号,缺少4个就补充两个==。没有理解的多看看下面的例子。
具体对于转换后余几位情况转换如下(这里主要针对英文,中文转换具体得看中文编码):
1.不需要补位
原文: p h p
对应ASCII: 01110000 01101000 01110000
每6位分割: 011100 000110 100001 110000 |
对应10进制值: 28 6 33 48
Base64对应的字符:c G h w
最后php=cGhw(base64)
2.需要补充四个二进制位
原文: r a n l
ASCII值:01110010 01100001 01101110 01101100
每6位分割:011100 100110 000101 101110 | 011011 00 0000 xxxxxx xxxxxx |
对应10进制值:28 38 5 46 27 0 = = 对应base64字符: c m F u b A = =
结果: ranl=cmFubA==(base64)
3.需要补充两个二进制位
原文 h a c k e
ASCII值: 01101000 01100001 01100011 01101011 01100101
每6位分割: 011010 000110 000101 100011 | 011010 110110 0101 00 xxxxxx |
对应10进制值: 26 6 5 35 26 54 20 =
对应base64字符: a G F j a 2 U =
结果 hacke=aGFja2U=(base64)
3. base64常见用途
1.传输不可见字符(128~255)不方便,容易出错。这里的不可见字符是正对ascii码(0~127)
2.web传输小图片(图片上传与图片显示):利用浏览器直接解析base64或使用js解析,避免多次请求。格式如下
2.1web后台生成/解析字符串
(1):图片生成base64字符串 byte[] data = null;
// 读取图片字节数组 try { InputStream in = new FileInputStream(imgFilePath); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } // 对字节数组Base64编码 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data);// 返回Base64编码过的字节数组字符串
(2):解析
// 对字节数组Base64解码 if (imgStr == null) // 图像数据为空 return false; BASE64Decoder decoder = new BASE64Decoder(); try { // Base64解码 byte[] bytes = decoder.decodeBuffer(imgStr); for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) {// 调整异常数据 bytes[i] += 256; } } // 生成jpeg图片 OutputStream out = new FileOutputStream(imgFilePath); out.write(bytes); out.flush(); out.close(); return true; } catch (Exception e) { return false; } }
附属图片:
参考文章: