前端理解base64

2023-05-16

一、背景:ascii码

字符=>二进制

计算机中所有数据的存储都是以二进制模式,比如想要存储abcd需将其转化为二进制,具体用哪些二进制来表示哪个符号*,有一个统一的编码规则,这就是ascii。

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。(2的八次方=256,8个bit可以用来表示0-255)

0-127可以表示大小写的26个字母、加减乘除符号、阿拉伯数据还有控制字符比如换行符等。

在这里插入图片描述
观察百度百科上的ascii码表(128个字符)可以发现第八位都是0,等于没用第八位。因为英语中128个字符即可表示所有。

ascii大小规则
0-9<A~Z<a-z。

但如果是其他语言,比如法语128个不够。于是欧洲国家决定启用闲置的第八位,这样就有256个了。不过不同的国家有不同的字母,后128位同一编码在不同语言中代表不同的字符。注意前128位是一样的

至于亚洲国家比如汉字就太多了,一个字节不够,必须采用多个字节代表一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 256 x 256 = 65536 个符号。

二、base64基本介绍

二进制=>字符

1.作用

  • base64编码是从二进制=>字符的过程。
  • 采用Base64编码具有不可读性,需要解码后才能阅读。但是base64不是加密,只是一种可被翻译的编码。
  • Base64编码可用于在HTTP环境下传递较长的标识信息,用作HTTP表单和HTTP GET URL中的参数。
  • 当需要把二进制数据放到url中时,采用base64具有不可读性比较合适

2. 使用原因

ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了

3. 如何生成

01000100010011101100111010111100011001010…那么我们取6个比特为一组,计算它的ascii值,得到一个字符,这个字符肯定是可见字符,好,把它对应的字符写出来,再取6个比特,计算…,如此下去,直到最后,就完成了编码。

4. 其他

  • 标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号。如下为base64对照表。注意和ascii表是不一样的!
    在这里插入图片描述

  • 6bit为一组,那么4个base64字符即表示了24bit,即3个字节(24/8=3)。可理解为,原先用二进制只需要3个字节表示的信息,用base64却要占4个字符(即四个字节)。

有点绕,举例吧

  • 转换前 10101101,10111010,01110110 (二进制)
  • 转换后(每六个为一组转为ascii码,ascii码就是8位的二进制)00101011, 00011011 ,00101001 ,00110110 (二进制)
  • 十进制:43 27 41 54
  • 对照base64表转为可见字符: r b p 2

计算机存储信息都是按ascii码来的,所以这四个字符在ascii码中是四个字节。原先3个字节的信息现在占位4个字节了,所以base64传输会使得信息变大, 为原来的4/3

  • 刚才说了base64可以用在url里,但是标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式。为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”。

三、图片Base64编码

1 图片的base64编码是什么

图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串表示图片,从而无需图片地址

这样做有什么意义呢?我们知道,我们所看到的网页上的每一个图片,都是需要消耗一个 http 请求下载而来的。

比如下图的图标
在这里插入图片描述
浏览器解析html到灰色标注的img那里,就会向src所在地址发一个请求,请求这个图片,下图即为发出的请求。
在这里插入图片描述

不管如何,图片的下载始终都要向服务器发出请求,要是图片的下载不用向服务器发出请求,而可以随着 HTML 的下载同时下载到本地那就太好了,而 base64 就可以。这里等于把图片变为一串编码,直接嵌在html里传递给了浏览器,浏览器不用再次请求图片了

举个栗子。www.google.com 的首页搜索框右侧的搜索小图标使用的就是base64编码。我们可以看到:
在这里插入图片描述
在这里插入图片描述

//在css里的写法
#fkbx-spch, #fkbx-hspch {
  background: url(https://img-blog.csdnimg.cn/2022010706012410164.gif) no-repeat center;
}
//在html代码img标签里的写法
<img src="https://img-blog.csdnimg.cn/2022010706012410164.gif">

上面分别是图片的 base64 编码在 css 里面的写法和在 html img 标签里的写法。base64 编码长得就是这个样子,随着html一起被发送给浏览器了。

2. 优点和缺点

  • 上述可看出这样可以节省一个 http 请求,算是前端优化的一部分
  • 在这里要明确使用 base64 的一个前提,那就是被 base64 编码的图片足够尺寸小。

以一张图片为例子
在这里插入图片描述
该图片大小为51kb
在这里插入图片描述
转为base64变成68295个字符,比原来大了。也就是说,图片被编码之后,生成的字符串编码大小一般而言都会比原文件稍大一些。即便 base64 编码能够被 gzip 压缩,压缩率能达到 50% 以上,想象一下,一个元素的 css 样式编写居然超过了 60000个 字符,那对 css 整体的可读性将会造成十分大的影响,代码的冗余使得在此使用 base64 编码将得不偿失

  • 所以如果如果图片足够小且因为用处的特殊性无法被制作成雪碧图(CssSprites),在整个网站的复用性很高且基本不会被更新。

比如有一个是我们经常会遇到的,就是页面的背景图 background-image 。在很多地方,我们会制作一个很小的图片大概是几px*几px,然后平铺它页面当背景图。因为是背景图的缘故,所以无法将它放入雪碧图,而它却存在网站的很多页面,这种图片往往只有几十字节,却需要一个 http 请求,十分不值得。那么此时将它转化为 base64 编码

雪碧图介绍:css雪碧图及优缺点
CSS Sprites在维护的时候比较麻烦,如果页面背景有少许改动,一般就要改这张合并的图片,无需改的地方最好不要动,这样避免改动更多的css,如果在原来的地方放不下,又只能(最好)往下加图片,这样图片的字节就增加了,还要改动css。

还有一种是iconfont,将图标转为svg。缺点是颜色是单一在css中设置的(像字体一样),ui给的炫酷图标无法用。而且如果想换个图标,还得跑阿里库上更新图重新生成压缩包。
iconfont使用在这里vue中阿里图标库iconfont的设置

3. 其他

  • Base64 的好处能够减少一个图片的 HTTP 请求,然而,付出的代价则是 CSS 文件体积的增大,CSS 文件体积的增大意味着 CRP。通俗而言,就是图片不会导致关键渲染路径的阻塞,而转化为 Base64 的图片大大增加了 CSS 文件的体积,CSS 文件的体积直接影响渲染,导致用户会长时间注视空白屏幕。HTML 和 CSS 会阻塞渲染,而图片不会。

所以,要有取舍地使用base64。正常比较大的图片,都不可用base64,因为塞进css里增大css文件阻塞渲染。base64适用于极小极简单的图片。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端理解base64 的相关文章

随机推荐

  • MATLAB diag & spdiags函数的使用

    diag amp spdiags函数的使用 xff1a 下面对diag 函数和spdiags函数进行了实例演示 xff0c 特别注意的是spdiags函数 xff1a 1 Bout d 61 spdiags A 矩阵A mn xff0c 当
  • diskpart命令创建GPT磁盘分区

    利用diskpart命令创建GPT磁盘分区图文教程很多朋友都是使用工具软件完成创建GPT磁盘分区 xff0c 实际上你无论你是使用光盘 U盘还是硬盘 NT6 等方式全新安装Win7或者Win8系统 xff0c 都可以利用diskpart命令
  • slf4j使用xml配置日志不能显示的问题

    在我使用slf4j的xml配置方式的时候 一直加载不出xml的配置文件 导致里面的设置不能被读取 控制台一直打印不去日志信息 正在寻找解决办法 报的错误是 log4j WARN Please initialize the log4j sys
  • Steghide使用教程及其密码爆破

    Steghide使用教程及其密码爆破 工具介绍 Steghide是一款开源的隐写术软件 xff0c 它可以让你在一张图片或者音频文件中隐藏你的秘密信息 xff0c 而且你不会注意到图片或音频文件发生了任何的改变 而且 xff0c 你的秘密文
  • Navicat如何连接远程服务器的MySQL

    前言 xff1a 运行环境及工具 Navicat for Mysql 腾讯云轻量级服务器一台 xff08 Centos 7 xff09 Mysql 8 0 24 xff08 远程服务器内安装的 xff09 Xshell7 xff08 连接操
  • 警告!你的隐私正在被上亿网友围观偷看!

    你的隐私正在被上亿万网友围观偷看 xff01 事情要从一款被推荐到烂的软件说起 Everything 这个软件想必很多同学都有听过 xff0c 是一款非常好用的文件搜索软件 xff0c 很多同学把它设置为开机必启动项之一 简单来说 Ever
  • Ubuntu安装JDK教程

    Ubuntu安装JDK教程 jdk的下载和安装 xff1a 1 打开浏览器 xff0c 输入jdk的官网地址 xff1a https www oracle com java technologies javase downloads htm
  • 面试官:如何让主线程等待所有的子线程执行结束之后再执行?我懵了

    使用Thread的join方法 package com qcy testThreadFinish 64 author qcy 64 create 2020 09 09 17 05 23 public class Case1 public s
  • 【亲测可用】 Mac/Linux 安装中文版 man 帮助命令

    Mac Linux 安装中文版 man 帮助命令 其中的需要下载的两个 安装包我上传到 csdn 了 xff0c 网络不好的可以直接 获取 不需要用 wget 下在 xff0c 虽然 wget 是很稳定 xff0c 但是国内的网络 还是太菜
  • 安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法

    安卓android一种沉浸式状态栏和导航栏并可设置渐变和图片的方法 介绍 网络上流传的状态栏导航栏沉浸的方式有很多 xff0c 但是在我使用的时候都失效了 xff0c 在官网也没找到合适的例子达到期望 xff0c 根据情况判断是由于目前版本
  • Python 循环结构

    在python中 xff0c 循环结构有for循环和while循环两种 1 while循环 while循环结构格式 xff1a while 条件表达式 xff1a 条件执行体 当条件表达式判断为真时 xff0c 就执行条件执行体中的内容 如
  • windows terminal + oh-my-posh 2022 [保姆级]配置教程

    windows terminal 43 oh my posh 2022 版配置教程 目录 windows terminal 43 oh my posh 2022 版配置教程 总览 1 下载powershell 2 安装字体 下载并安装字体至
  • DataBinding的基本使用(五)

    DataBinding的基本使用 五 DataBinding基本使用包括以下内容 xff1a 单纯的摆脱findviewbyid 绑定基本数据类型及String 绑定Model数据 绑定事件 通过静态方法转换数据类型 通过运算符操作数据 自
  • idea快捷键大全

    实用快捷键 Ctrl 43 或 Ctrl 43 Shift 43 注释 xff08 或者 xff09 Ctrl 43 D 复制行 Ctrl 43 X 删除行 快速修复 alt 43 enter modify cast 代码提示 alt 43
  • 自定义组件实现v-model

    在项目中需要做一个标题展开框 xff0c 点击展开才会显示下面的内容 因为多个地方都需要这样的可展开标题 xff0c 所以做了一个自定义组件 组件需要一个双向绑定的值 xff0c 控制展开 缩放 于是就思考 xff0c 父向子可以用prop
  • linux下提示bash:command not found

    如果新装的系统 xff0c 运行一些很正常的诸如 xff1a shutdown xff0c fdisk的命令时 xff0c 悍然提示 xff1a bash command not found 那么 首先就要考虑root 的 PATH里是否已
  • k8s与pod概念

    此文章为学习过程中根据网上资源整合总结 文章目录 1 为什么需要k8s1 1 应用部署模式的演进1 11 模式对比1 12 各模块介绍 1 2 管理大量的容器 k8s 2 ks8的集群架构3 pod k8s调度的最小单元3 1 一个 pod
  • git在http协议切换账号/输错账号密码如何更改

    掩面哭泣 xff0c 为什么提交总会出问题 这次是因为我push到gerrit上的时候第一次用错成了自己的账号 xff0c 然后想更改成公司的 xff0c 不再跳出登录界面了 xff0c 改不了 因为只有公司账号上设置了agreement
  • 【vue】利用prettier插件规避烦人的eslint报错和代码不规范

    本文主要包括两点 xff1a 大家协同开发代码各异 xff0c eslint加上 64 vue prettier采取recommended 43 prettier组合可使得代码更规范使用vscode的prettier插件在修改保存时自动格式
  • 前端理解base64

    一 背景 xff1a ascii码 字符 61 gt 二进制 计算机中所有数据的存储都是以二进制模式 xff0c 比如想要存储abcd需将其转化为二进制 xff0c 具体用哪些二进制来表示哪个符号 xff0c 有一个统一的编码规则 xff0