[一文详解]Base64编码,Url Base64编码,UrlEncode编码,你还傻傻分不清吗?

news2024/11/28 10:38:46

base64编码

由来

Base64算法最早应用于解决电子邮件传输问题,在早期,电子邮件只支持ASCII码字符。

而ASCII码其长度为1个字节,是7位编码,最高位是0,是有符号字符型数。

如果要传输一封带有非ASCII码字符的电子邮件,当它经过部分网关时就可能出现问题,这个网关可能会对非ASCII码字符的二进制位进行调整,即将这个非ASCII码的8位二进制码最高位置设置为0,此时用户收到的邮件就会是一封乱码的了。由此原因产生了Base64算法。


介绍

Base64 是一种用于将二进制数据编码成 ASCII 字符的编码方式。它主要用于在文字环境中传输或存储二进制数据,如在电子邮件、XML 文件、URL 参数等。Base64 编码不是一种加密算法,而是一种编码方式,其主要作用是将二进制数据转换为文本数据,以便更容易在文本协议中处理。

Base64 编码使用 64 个不同的字符来表示二进制数据。这些字符包括大小写字母 A-Z 和 a-z、数字 0-9,以及两个额外的字符通常是 “+” 和 “/”。有时候,为了适应不同的环境,可能还会使用额外的字符,如 “=” 用于填充。
在这里插入图片描述

这张字符映射表中,Value指的是十进制编码,Encoding指的是字符,共映射了64个字符,这也是Base64算法命名的来源。映射表的最后一个字符是等号,它是用来补位的。


编解码过程

编码的过程如下:

  1. 将给定的字符串以字符为单位,分别转换成对应的字符编码(如ASCII码)

  2. 将每个字符对应的字符编码转换成二进制

  3. 将二进制码进行分组转换操作:(得到4-6二进制码组)

    将原先每3个8位二进制码为一组,将其转换为每4个6位二进制码为一组(其中哪个不足6位时低位补0)。

    这是一个分组变化的过程,3个8位二进制码和4个6为二进制码的长度都是24位

  4. 将获得的4-6二进制码组进行补位,向一组中每个6位二进制码高位补2个0,组成4个8位的二进制码

  5. 将获得的4-8二进制码组转换为十进制码

  6. 将获得的十进制码转换成Base64字符表中对应的字符

例子:假设场景,我们需要对"A"进行Base64编码,操作如下:
字符============================A
ASCII编码======================65
二进制码=======================01000001
4-6二进制码====================010000                010000(不足6位,低位补0)
4-8二进制码====================00010000(高位补2个0)   00010000(高位补2个0)
十进制码=======================16                      16
字符映射表=====================Q                        Q         =        =

注意:

  • 如果原始数据的长度不是3的倍数或者说Base64编码出来的串不是4的整数倍,可能会有一些填充字符(通常是 “=”)
  • 解码的过程是编码的逆过程,将 Base64 字符转换回原始的二进制数据。

Base64 的主要优点是它能够将二进制数据以文本形式呈现,且编码后的数据长度通常比原始数据小,这对于在文本协议中传输二进制数据是很有用的。然而,它并不是为了安全而设计的,因此不应用于对数据进行加密。

算法演变

计算字符串在转成 Base64 编码后的长度可以通过以下简单的公式来估算:

  1. 计算原始字符串的字节数(每个字符通常占用一个字节,但是对于 Unicode 字符,可能会占用多个字节)。

  2. 计算 Base64 编码后的长度:
    img

    这个公式的解释如下:

    • 每个 Base64 字符表示 6 个比特(2^6 = 64)。
    • 每组 3 个字节的数据被编码成 4 个 Base64 字符。
    • 如果原始字节数不能被 3 整除或者说Base64编码出来的串不是4的整数倍,可能会有填充字符 “=”。

以下是一个简单的 Python 示例,演示如何计算字符串经过 Base64 编码后的长度:

  • 使用上面公式计算长度

base64最小长度是4位,每个base64的长度都是4的倍数,不够长度结尾补=符号

原字符每6bit一组base64编码
a1*8/6=2YQ==
ab2*8/6=3YWI=
abc3*8/6=4YWJj
abcd4*8/6=6YWJjZA==
abcde5*8/6=7[]YWJjZGU=

请注意,这只是一个估算。实际的编码长度可能会受到编码实现细节的影响,例如是否包含换行符等。

url base64编码

介绍

为了能在HTTP请求中以GET方式传递二进制数,由Base64算法衍生出了Url Base64算法。

UrlBase64 是 Base64 编码的一种变体,主要用于在 URL 中安全地传输二进制数据。

它与标准的 Base64 编码相比,有一些微小的差异,以确保编码后的字符在 URL 中不会引起问题。

与base64的差异

Url Base64主要是替换了Base64字符映射表中的第62、63个字符,也就是将”+”和”/”符号用”-“和”_”代替。至于”=”在Bouncy Castle提供者使用的是”.”代替,而在Commons Codec里则是完全杜绝使用补位符。

UrlBase64 主要有以下两个特点:

  1. 字符集不同: 在标准的 Base64 编码中,使用字符 “+”, “/”,而这两个字符在 URL 中有特殊的含义,可能会引起歧义或导致 URL 解析错误。为了解决这个问题,UrlBase64 将字符 “+” 替换为 “-”, 将 “/” 替换为 “_”。
  2. 去掉填充字符: 标准的 Base64 编码在最后可能会使用一个或两个 “=” 字符进行填充,以使编码后的字符串长度是4的倍数。但是在 URL 中,这些填充字符可能引起问题,因此 UrlBase64 通常去掉填充字符,直接使用编码后的字符串。

总体而言,UrlBase64 是为了适应 URL 中的特殊需求而修改的 Base64 编码。在处理需要在 URL 中传递的二进制数据时,使用 UrlBase64 可以确保编码后的字符串在 URL 中是安全且可靠的。在使用 UrlBase64 解码时,需要在解码之前将 “_” 替换为 “/”,将 “-” 替换为 “+”,并根据需要添加填充字符。


UrlEncode编码

介绍

urlencode 是一种对 URL 进行编码的方法,用于将特殊字符转换为符合 URL 规范的安全字符,以便在网络传输或嵌入到 URL 中时不引起歧义或错误。在Web开发中,这是一个常见的操作,通常在将数据附加到URL参数中时使用。

使用URLEncode原因:

1、字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的

2、因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urlencode 函数,因为 url 中不能包含 @ 字符
3、url转义其实也只是为了符合url的规范而已。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。(主要就是消除服务器解析url时的歧义)

原理

URLEncode 编码的基本原理:

  1. 保留字符: 字母、数字和以下字符被视为“保留字符”:

    - _ . ! ~ * ' ( ) ; : @ & = + $ , / ? # [ ]
    

    这些字符在 URL 中有特殊含义,但如果需要在 URL 中表示它们的字面值,就需要进行编码。

  2. 编码原则: 使用百分号(%)后跟两个十六进制数字表示每个字符/每个字节的编码。

    所以URL编码(URL Encoding)也称作百分号编码(Percent Encoding) .

例如,浏览器中进行百度搜索“你好”时,链接地址会被自动编码:
(编码前)https://www.baidu.com/s?wd=你好
(编码后)https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD
出现以上情况是因为网络请求前,浏览器对请求URL进行了URL编码(URL Encoding)。

编码规则

URLEncode 规则:

  1. 将空格转换为加号(+)
  2. 对0-9、a-z、A-Z之间的字符保持不变
  3. 对于所有其他的字符,用这个字符的当前当前字符集编码在内存中的十六进制格式表示,并在每一个字节前加上一个百分号(%),如字符“+”是用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中占两个字节,字符“中”用%D6%D0表示,字符“国”用%B9%FA表示。
  4. 空格也可以直接用其十六进制编码方式,即用%20表示,而不是将它转换为加号(+)。

特殊字符:

特殊字符编码结果
+%2B
=%3D
#%23

总体而言,urlencode 是一个在Web开发中非常实用的,确保在URL传递和构建时不会因为特殊字符而引起问题。


The End!!创作不易,欢迎点赞/评论!!欢迎关注我的GZ号!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1356857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干洗机,将对相关行业带来巨大的发展机遇

干洗机是一种高效、节能、环保的清洗设备,广泛应用于干洗店、酒店、医疗机构、工厂等领域。全球市场 全球市场上,干洗机的市场规模和应用范围不断扩大。根据市场研究机构的数据,2019年全球干洗机市场规模约为80亿美元左右,年复合增…

2023年终总结,被裁员

在一个睡意朦胧的早上,我被闹钟惊醒,原来今天已经是2024年1月1日了,2023年平平无奇的结束了,唯一让我感触波深的事情是我在二月份的裁员名单里面。2024加油!!! 工作上的总结 回顾2023&#xf…

LLM Agent之再谈RAG的召回信息密度和质量

话接上文的召回多样性优化,多路索引的召回方案可以提供更多的潜在候选内容。但候选越多,如何对这些内容进行筛选和排序就变得更加重要。这一章我们唠唠召回的信息密度和质量。同样参考经典搜索和推荐框架,这一章对应排序重排环节,…

听GPT 讲Rust源代码--compiler(8)

File: rust/compiler/rustc_trait_selection/src/solve/weak_types.rs 在Rust编译器的源代码中,rust/compiler/rustc_trait_selection/src/solve/weak_types.rs文件的作用是处理弱类型化解决方案。 在编译器中,当我们在代码中使用一个未经完全指定的泛型…

javascript 常见工具函数(二)

11.数组等分切片&#xff1a; this.newMapList []; for (var i 0; i < this.mapDataList.length; i 2) {this.newMapList.push(this.mapDataList.slice(i, i 2)); } 12.js做奇偶判断&#xff1a; if (this.mapDataList.length ! 0) {this.mapDataList.length % 2 0 ?…

python包chromadb安装失败总结

1&#xff0c;背景&#xff1a; 最近在学习langchain的课程&#xff0c;里面创建自己的知识库的Retrieval模块中&#xff0c;需要用到向量数据库。 所以按照官方的教程&#xff08;vectorstores&#xff09;&#xff0c;准备使用chroma的向量数据库。图片来源 2&#xff0c;问…

14.两数之和

题目 class Solution {public int[] twoSum(int[] nums, int target) {int[] ret {-1,-1};for(int i0;i<nums.length;i) {for(int ji1;j<nums.length;j) {if(nums[i] nums[j] target) {ret[0] i;ret[1] j;}}}return ret;} }

java实现大文件分片上传

背景&#xff1a; 公司后台管理系统有个需求&#xff0c;需要上传体积比较大的文件&#xff1a;500M&#xff0d;1024M&#xff1b;此时普通的文件上传显然有些吃力了&#xff0c;加上我司服务器配置本就不高&#xff0c;带宽也不大&#xff0c;所以必须考虑多线程异步上传来提…

Flink 维表关联方案

Flink 维表关联方案 1、Flink DataStream 关联维表 1&#xff09;概述 1.分类 实时数据库查找关联&#xff08;Per-Record Reference Data Lookup&#xff09; 预加载维表关联&#xff08;Pre-Loading of Reference Data&#xff09; 维表变更日志关联&#xff08;Refere…

SpringBoot从配置文件中获取属性的方法

方式一&#xff1a;Value 基本类型属性注入&#xff0c;直接在字段上添加Value("\${xxx.xxx}")即可&#xff0e;注意这里用的是$&#xff0c;而不是&#xff03;&#xff0c;Value注入的属性&#xff0c;一般其他属性没有关联关系。 配置文件 user:name: Manaphya…

代码随想录算法训练营day6|242.有效的字母异位词、349.两个数组的交集、202.快乐数

哈希表理论基础 建议&#xff1a;大家要了解哈希表的内部实现原理&#xff0c;哈希函数&#xff0c;哈希碰撞&#xff0c;以及常见哈希表的区别&#xff0c;数组&#xff0c;set 和map。 什么时候想到用哈希法&#xff0c;当我们遇到了要快速判断一个元素是否出现集合里的时…

C#用StringBuilder高效处理字符串

目录 一、背景 二、使用StringBuilder便捷、高效地操作字符串 三、实例 1.源码 2.生成效果 四、实例中知识点 1.StringBuilder类 一、背景 符串是不可改变的对象&#xff0c;字符串在创建以后&#xff0c;就不会被改变&#xff0c;当使用字符串对象的Replace、split或Re…

提供电商Api接口-100种接口,淘宝,1688,抖音商品详情数据安全,稳定,支持高并发

Java是一种高级编程语言&#xff0c;由Sun Microsystems公司于1995年推出&#xff0c;现在属于Oracle公司开发和维护。Java以平台无关性、面向对象、安全性、可移植性和高性能著称&#xff0c;广泛用于桌面应用程序、嵌入式系统、企业级服务、Android移动应用程序等。 接口是Ja…

JS运行机制、Event Loop

1、JS运行机制 JS最大的特点就是单线程&#xff0c;所以他同一时间只能做一件事情。使单线程不阻塞&#xff0c;就是事件循环。 在JS当中分为两种任务&#xff1a; 同步任务&#xff1a;立即执行的任务&#xff0c;一般放在主线程中&#xff08;主执行栈&#xff09;。异步任…

Python消消乐小游戏(PyGame)

文章目录 写在前面喜羊羊与灰太狼PyGame入门消消乐注意事项写在后面 写在前面 本期内容&#xff1a;基于pygame实现喜羊羊与灰太狼版消消乐小游戏 实验环境 python3.11及以上pycharmpygame 安装pygame的命令&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.c…

前端基础:Vue搞笑白话文(工作之余瞎写)

1、data:{}与data(){return{}}这两个是个什么鬼&#xff1f; vue实例 new Vue({el:#app,data:{name:李四}}) 组件实例 const aaa Vue.extent({data(){return {name:}} }) 为什么Vue实例可以那么写而组件实例就不行了&#xff1f;原因就是因为在底层原理上&#xff0c;组件…

【KingbaseES】实现MySql函数Space

CREATE OR REPLACE FUNCTION SPACE(input_length integer) RETURNS text AS $$ BEGIN RETURN REPEAT( , input_length) AS SPACES; END; $$ LANGUAGE plpgsql;

Windows 下用 C++ 调用 Python

文章目录 Part.I IntroductionChap.I InformationChap.II 预备知识 Part.II 语法Chap.I PyRun_SimpleStringChap.II C / Python 变量之间的相互转换 Part.III 实例Chap.I 文件内容Chap.II 基于 Visual Studio IDEChap.III 基于 cmakeChap.IV 运行结果 Part.IV 可能出现的问题Ch…

从零开始使用Konva,画图并绑定节点。

实战可行&#xff0c;vue3vitets实现 实现电子地图&#xff0c;左侧列表可拖拽绑定 地图可绑定点设备坐标 安装 npm install konva 插件引入 import Konva from konva import Konva from konva import { getImgUrl } from /utils export class konvaManager {public stage…

视频怎么配上音乐?视频软件轻松配乐

视频怎么配上音乐&#xff1f;视频配乐已经成为了一种重要的表达方式。它能够为视频增添情感&#xff0c;营造氛围&#xff0c;让观众更加深入地理解视频的内容。那么&#xff0c;哪些软件可以给视频配上音乐呢&#xff1f;本文将为你介绍几款优秀软件。 一、清爽视频编辑 清爽…