目录

编码说明

编码方式

体积增大

= 等号

demo


编码说明

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,由于 2^6=64,所以每 6 个比特为一个单元,对应某个可打印字符。

Base64 常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括 MIME 的电子邮件及 XML 的一些复杂数据。

项目中遇见处理字节数组与string互转时,如不指定字符集,会导致字符数组长度有变的问题,后文demo里说

Base64 编码要求把 3 个 8 位字节(3*8=24)转化为 4 个 6 位的字节(4*6=24),之后在 6 位的前面补两个 0,形成 8 位一个字节的形式。 如果剩下的字符不足 3 个字节,则用 0 填充,输出字符使用 =,因此编码后输出的文本末尾可能会出现 1 或 2 个 =。

为了保证所输出的编码位可读字符,Base64 制定了一个编码表,以便进行统一转换。编码表的大小为 2^6=64,这也是 Base64 名称的由来。

在 Base64 中的可打印字符包括字母 A-Za-z、数字 0-9,这样共有 62 个字符,此外两个可打印符号在不同的系统中而不同(+ 和 /,还有=)。

Base64是一种索引编码,每个字符都对应一个索引,具体的关系图,如下

编码方式

由于64等于2的6次方,所以一个Base64字符实际上代表着6个二进制位(bit)。
然而,二进制数据1个字节(byte)对应的是8比特(bit),因此,3字节(3 x 8 = 24比特)的字符串/二进制数据正好可以转换成4个Base64字符(4 x 6 = 24比特)。
为什么是3个字节一组呢? 因为6和8的最小公倍数是24,24比特正好是3个字节。

具体的编码方式:

  1. 将每3个字节作为一组,3个字节一共24个二进制位

  2. 将这24个二进制位分为4组,每个组有6个二进制位

  3. 在每组的6个二进制位前面补两个00,扩展成32个二进制位,即四个字节

  4. 每个字节对应的将是一个小于64的数字,即为字符编号

  5. 再根据字符索引关系表,每个字符编号对应一个字符,就得到了Base64编码字符

上图中的字符串 'you',经过转换后,得到的编码为: 'eW91'

体积增大

我们可以看到,当3个字符进行Base64转换编码后,最后变成了4个字符。因为每个6比特位,都补了2个0,变成8比特位,对应1字节。
这里正好多了三分之一,所以正常情况下,Base64编码的数据体积通常比原数据的体积大三分之一

= 等号

3个英文字符,正好能转成4个Base64字符。那如果字符长度不是3的倍数,那应该使用什么样的规则呢?
其实也简单,我们在实际使用Base编码时,常会发现有第65个字符的存在,那就是 '=' 符号,这个等于号就是针对这种特殊情况的一种处理方式。
对于不足3个字节的地方,实际都会在后面补0,直到有24个二进制位为止。
但要注意的是,在计算字节数时,会直接使用总长度除以3,如果余数为1则会直接在最后补一个=,如果余数为2则补两个=
因此,转码后的字符串需要补的后缀等号,要么是1个,要么是2个,具体的可以见下图:

图中第二个,使用的是单独的字符 'd',是为了区分索引字符表里的索引0,这个时候,得到编码中,会存在一个索引0对应的A字符,而'='是直接补上2个。

demo

package com.cjian.security;import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;import java.security.SecureRandom;/*** @Author: cjian* @Date: 2022/11/9 17:09* @Des:*/
public class Base64Demo {public static Base64 base64 = new Base64();public static void main(String[] args) {String man = base64.encode("you".getBytes());System.out.println("you的base64结果:"+man);SecureRandom secureRandom = new SecureRandom();byte[] randomBytes = new byte[16];secureRandom.nextBytes(randomBytes);String str = new String(randomBytes);System.out.println("原值:" + str);//问题来了,长度发生了变化//如果转string和获取字节的时候指定ISO-8859-1就没有问题System.out.println("原值转byte长度:"+str.getBytes().length);String r = base64.encode(randomBytes);System.out.println("base64后:" + r);String str2 = new String(base64.decode(r));System.out.println("base64编码:" + str2);System.out.println("base64解码后byte长度:" + base64.decode(r).length);}}

输出:

you的base64结果:eW91
原值:�;Ķp�K�n�ώ�|/
原值转byte长度:26
base64后:1DvEtnCSS55uFMPPjqp8Lw==
base64编码:�;Ķp�K�n�ώ�|/
base64解码后byte长度:16

Base64编码知识记录相关推荐

  1. 前端Base64编码知识,一文打尽

    原文: https://juejin.cn/post/6989391487200919566 作者: 云的世界 掘金专栏: 前端基础进阶 健康满分 关注并将「趣谈前端」设为星标 每天定时分享技术干货/ ...

  2. ​Base64编码知识详解 ​

    在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...

  3. 一文打尽前端 Base64 编码知识

    关注公众号 前端开发博客,回复"加群" 加入我们一起学习,天天进步 前言 本文收录在 前端基础进阶[1] 专栏,欢迎关注和收藏, 往期经典: [干货]私藏的这些高级工具函数,你拥有 ...

  4. Web项目实战 | 购物系统v2.0 | 开发记录(五)使用base64编码实现头像修改 | 用户个人信息修改 | JQuery动态提示

    文章目录 以往记录 一.运行环境 二.实现头像修改 三.用户个人信息修改 四.Bug & DeBug 以往记录 Web项目实战 | 购物系统v2.0 | 开发记录(一)需求分析 | 技术选型 ...

  5. 深入理解Base64字符串编码知识

    在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...

  6. 一些Base64编码/解码及数据压缩/解压方面的知识

    一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeD ...

  7. Base64编码相关知识总结

    Base64编码是什么? Base64,顾名思义,就是包括小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"一共64个字符的字符集,(另加一个&qu ...

  8. delphi Base64编码/解码及数据压缩/解压知识

    一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeD ...

  9. 爬虫基础知识记录の二

    1.HTTP响应 前面说过了Http方式发出了网址请求,现在介绍一下服务器收到请求后的响应,响应就是服务器对应请求信息的回馈,由响应状态码.响应头和响应体组成. 常见响应状态码有:表示成功的200,表 ...

最新文章

  1. Spring Boot 2.3.0 发布:支持Java14、打包Docker镜像、优雅关机配置...
  2. 算法----------快乐数 (Java版本)
  3. netflix 模式创新_创新设计模式:工厂模式
  4. mysql的char和varchar_MySQL的char和varchar
  5. mysql general bin区别_MySQL_编码utf8_bin和utf8_general_ci的区别
  6. 页面无法正常显示,淘宝又崩了!周五上班摸鱼被发现...
  7. 进程间通信(未完成)
  8. python3爬取数据存入mysql_pyspider 数据存入Mysql--Python3
  9. 【c语言】用指针变量输出一维数组中的数据
  10. Emacs中自动刷新dired缓冲区
  11. 陈纪修老师《数学分析》 第12章:多元函数微分学 笔记
  12. 关于路由器,锐捷破解,mentohust的使用
  13. $(this).bind(change,itemno_change);
  14. 异步FIFO跨时钟域亚稳态如何解决?
  15. 【云计算】一文了解裸金属服务器(一)
  16. 【刷题】BZOJ 2959 长跑
  17. Apple 软件产品使用的 TCP 和 UDP 端口
  18. win10系统批量替换文件名
  19. Bugzilla 的安装
  20. bp神经网络缺点及克服,bp神经网络存在的问题

热门文章

  1. 解决程序包不存在报错
  2. jsp+ssm计算机毕业设计校园闲置物品租赁系统【附源码】
  3. Exception from hresult 0x80041FE2,vs2015创建QT项目报错
  4. 个人管理软件-改变你的一生
  5. 性能分析11-内存分析2-内存溢出定位方式
  6. 活动结束啦,那么复盘该从哪些方面展开?
  7. Vscode 配置 matlab 环境
  8. python学习之RC4算法实现
  9. Windows配置bat脚本后台运行
  10. 排查mysql innodb Lock wait timeout exceeded; try restarting transaction的问题