HTTP是超文本传输协议,所以HTTP协议中请求、相应都是以ASCII字符方式传输,如果要传输二进制需要经过BASE64或MIME等编码(因为HTTP协议pop3、smtp邮件协议都是针对文本的,而FTP支持传输二进制数据,即不需要经过编码转换成字符型数据)

HTTP传输字节流时为什么会用Base64编码

可能很多人不明白,为什么在进行HTTP传输时二进制数据时,需要将字节流进行Base64编码呢?

可能很多小伙伴都会认为,HTTP传输文本底层仍然是字节流数据,为什么我通过HTTP请求直接传输文件的字节流还需要进行编码呢?

因为HTTP是文本协议,它只能传输ASCII码表中可打印字符的编码(类似的还有SMTP邮件协议),ASCII码表的范围是0-127(只需要一个字节中的七位),而一个字节是八位,这也意味着原本8bit字节码(范围0-255)超过了可用范围,因此无法被传输(ASCII码中有一部分控制字符,它们同样无法传输)。例如:当传输图片时某一个byte的值是0x10111011,对应的十进制是187不属于ASCII码的范围,因此无法被传输。

:ASCII码的范畴是0-127,其中0-31和127这33个字符属于控制字符。

Base64原理

把3个8bit字节(3x8=24)转换为4个6位的字节(4x6=24),之后每个六位的前面补0,形成完整8bit字节。在根据每个字节的值,用下表中的值进行替换,不足四个字节的补=

向下图中,8bit x 3的字符串可以每6个bit分成一组,每一组bit对应一个十进制index,每个index又对应了Base64字符。

最终,8bit字符串Man编码成了Base64的TWFu。相比8bit的字符编码,Base64编码会多占用三分之一的字节长度,以此为代价实现了更好的兼容性。

如果原本8bit字符串长度不是3的倍数,例如我们需要对长度为1个字节的数据进行编码,Base64会对匹配不到8bit字节的6bit字节位用=填充:

Java中Base64编码与解码的使用

早期用法(不建议)

final BASE64Encoder encoder = new BASE64Encoder();
final BASE64Decoder decoder = new BASE64Decoder();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = encoder.encode(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8")); final BASE64Encoder encoder = new BASE64Encoder();
final BASE64Decoder decoder = new BASE64Decoder();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = encoder.encode(textByte);
System.out.println(encodedText); //解码
System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));

从以上程式可以发现,在Java用Base64一点都不难,不用几行程式码就解决了!只是这个sun.mis c套件所提供的Base64功能,编码和解码的效率并不太好,而且在以后的Java版本可能就不被支持了,完全不建议使用。

Java 8之后的作法

Java 8的java.util套件中,新增了Base64的类别,可以用来处理Base64的编码与解码,用法如下:

final Base64.Decoder decoder = Base64.getDecoder();
final Base64.Encoder encoder = Base64.getEncoder();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decode(encodedText), "UTF-8")); final Base64.Decoder decoder = Base64.getDecoder();
final Base64.Encoder encoder = Base64.getEncoder();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decode(encodedText), "UTF-8"));

文章参考:

https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653191459&idx=1&sn=6e7d82dabe9c4a26b55f86f502edac03&chksm=8c990ff9bbee86ef7d6eee8a92430ff529b57e2f8720d439b7a4fb83b9ba75cd91395509a239&mpshare=1&scene=23&srcid=1222K4IGT8SVRmO6lUln3Y1A&sharer_sharetime=1576982768669&sharer_shareid=e81601a95b901aeca142bbe3b957819a#rd

https://www.cnblogs.com/alter888/p/9140732.html

什么是Base64算法的更多相关文章

  1. MD5加密、时间戳转换、base64算法加密、解密

    #region MD5加密 /// <summary> /// MD5加密 /// </summary> /// <param name="str"& ...

  2. java Base64算法的使用

    Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...

  3. Base64算法

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/4288372.html ...

  4. MD5加密算法(信息摘要算法)、Base64算法

    1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...

  5. c# base64算法解密

    /// <summary> /// 将字符串使用base64算法加密 /// </summary> /// <param name="code_type&quo ...

  6. java基础---->Base64算法的使用

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...

  7. 【转】Base64算法详解

    原文链接:https://blog.csdn.net/robertcpp/article/details/51628647 完整的BASE64定义可见RFC 1421和RFC 2045.编码后的数据比 ...

  8. java Base64算法

    Base64算法并不是加密算法,他的出现是为了解决ASCII码在传输过程中可能出现乱码的问题.Base64是网络上最常见的用于传输8bit字节码的可读性编码算法之一.可读性编码算法不是为了保护数据的安 ...

  9. Base64 算法原理,以及编码、解码【加密、解密】 介绍

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...

  10. 传奇的通迅协议与base64算法

    传奇的数据根本就没加密. 只要把#(数字)!去掉,中间的那些全部减0x3c,然后,四个字节一组,每个字节取低六位组成6*4=24位,然后分成3个字节,这个是很经典的base64的算法.不过小改了一些, ...

随机推荐

  1. 高可用之战:Redis Sentinal(哨兵模式)

    ★ Redis24篇集合 1 背景 在我们的<Redis高可用之战:主从架构>篇章中,介绍了Redis的主从架构模式,可以有效的提升Redis服务的可用性,减少甚至避免Redis服务发生完 ...

  2. Tomcat启动闪退的10个解决小技巧

    引言 大家好!在我们日常开发中,使用Tomcat作为Web服务器是相当常见的. 然而,遇到Tomcat启动后立即闪退的问题也不是什么稀罕事. 这种情况可能会让人感到困惑和沮丧,特别是当你急需完成一个项 ...

  3. 国产gowin开发板GW1NR-9K的PSRAM使用说明

    开发板子采用GW1NNR-LV9LQ144PC6/I5 FPGA器件.具有低功耗,瞬时启动,高安全性,低成本,方便扩展等特点.本开发板价格价格便宜,板子扩张性容易,帮助用户比较快速进入国产FPGA学习 ...

  4. 为什么我要写spring.factories文件?

    在阅读spring-boot相关源码时,常常见到spring.factories文件,里面写了自动配置(AutoConfiguration)相关的类名,因此产生了一个疑问:"明明自动配置的类 ...

  5. (react)获取json数据与传入(antd配合)

    import React from 'react'; import {fetch} from 'whatwg-fetch'; // import {HashRouter as Router,Route ...

  6. Java实现学生投票系统

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 代码 im ...

  7. 牛客网-SQL专项训练14

    ①通过子查询的方式从衬衫表SHIRTABLE中选取出销售单价shirt_price高于全部衬衫的平均价格的衬衫名字:B 解析: 题目要求需要用到子查询,故排除AC选项,而D选项在where子句中使用了 ...

  8. HarmonyOS NEXT应用开发案例—使用弹簧曲线实现抖动动画及手机振动效果案例

    介绍 本示例介绍使用vibrator.startVibration方法实现手机振动效果,用animateTo显示动画实现点击后的抖动动画. 效果图预览 使用说明 加载完成后显示登录界面,未勾选协议时点 ...

  9. 「开源人说」|AI普惠,阿里灵杰开源历程与思考

    简介: 施兴 阿里巴巴资深技术专家 阿里巴巴开源项目EasyRec负责人 以下为开发者社区「开源人说」第四期--大数据&AI专场的主题分享,点击链接了解更多精彩详情 https://devel ...

  10. EDAS微服务应用同城容灾最佳实践

    简介: 大多数业务应用只要做到同城双活,就可以避免掉大多数数据中心不可用故障.本实践就是帮助大家高效.低成本地实现自己的业务应用具备同城双活容灾能力. 前言 上云目前已经是绝大数企业首选的IT基础设施 ...