Base64编码原理和代码实现

1、Base64编码实现原理

第一步:
原理是把每 3 个字节(每个字节为 8 位, 3 个字节为 24 位)重新划为 4 组(每组为 6位)

第二步:
重新划分的每组 6 位的字节中,高位补两个 0 为 8 位后作为一个新的 8 位字节,每个字节数值的范围是 00000000 - 00111111 即十进制的 0 - 63。有效位6位(最前两的两位为 0 ),即为2^6^,总共对应64个字符

第三步:
将划分后的字节的数值作为索引查编码表,获得相应的字符,从而得到编码后的字符串。通过 64 个字符来对任意数据进行编码,因此称为 Base64。

 

2、Base64索引查询编码表

图片

 
 

3、示例说明

以字符串 “NEW” 为例,对其 Base64 编码:

图片

如果要编码的字节数不能被 3 整除,最后会多出 1 个或 2 有效的字节。将这样处理,将其用 0 补充至 6 的最小倍数位后,剩余的空位将使用 “=” 填充处理。例如:

图片

图片

经过 Base64 编码后数据会增大,数据经过 Base64 处理后,由原来每 3 个字节,变为为 4 个字节,数据大小会变为原来的 4/3, 因此数据增大 1/3。

 

4、代码模拟实现base64算法

function base64encode(text) {// base64 编码字符映射表let base64Code ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";let res = "";let i = 0;while (i < text.length) {let char1, char2, char3, enc1, enc2, enc3, enc4;char1 = text.charCodeAt(i++);char2 = text.charCodeAt(i++);char3 = text.charCodeAt(i++);enc1 = char1 >> 2; // 取第 1 字节的前 6 位if (isNaN(char2)) {// 只有 1 字节的时候enc2 = ((char1 & 3) << 4) | (0 >> 4); // 第65个字符用来代替补位的 = 号enc3 = enc4 = 64;} else if (isNaN(char3)) {// 只有 2 字节的时候enc2 = ((char1 & 3) << 4) | (char2 >> 4);enc3 = ((char2 & 15) << 2) | (0 >> 6);enc4 = 64;} else {enc2 = ((char1 & 3) << 4) | (char2 >> 4); // 取第 1 个字节的后 2 位(3 = 11 << 4 = 110000) + 第 2 个字节的前 4 位enc3 = ((char2 & 15) << 2) | (char3 >> 6); // 取第 2 个字节的后 4 位 (15 = 1111 << 2 = 111100) + 第 3 个字节的前 2 位enc4 = char3 & 63; // 取最后一个字节的最后 6 位 (63 = 111111)}res +=base64Code.charAt(enc1) +base64Code.charAt(enc2) +base64Code.charAt(enc3) +base64Code.charAt(enc4);}return res;
}console.log(base64encode('NEW'));
console.log(base64encode('NE'));
console.log(base64encode('N'));

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

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

相关文章

脚手架搭建项目package.json配置中依赖的版本问题

脚手架搭建项目package.json配置中依赖的版本问题 问题描述&#xff1a;项目刚搭建好&#xff0c;运行没有问题&#xff0c;为什么过一段时间&#xff0c;删除node_modules&#xff0c;或者重新安装包依赖&#xff0c;然后项目某些地方出现莫名的错误&#xff08;依赖库的地方…

Redis篇:缓存击穿及解决方案

1.何为缓存击穿 缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff08;有可能是正好过期了&#xff09;&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 常见的解决方案有两种&#xff1a; 互斥锁 逻…

逐行分析Transformer的程序代码,最后免费附上该代码!!

1. 代码详细解释 1. 第一段代码 这段代码首先定义了一些参数&#xff0c;包括编码器个数、输入维度、句子长度、词嵌入维度等。然后它保存了这些超参数到指定路径。接着&#xff0c;它加载训练和验证数据集&#xff0c;并创建了对应的数据加载器。之后&#xff0c;它定义了一个…

PHP 爬虫如何配置代理 IP(CURL 函数)

在 PHP中 配置代理IP&#xff0c;可以通过设置 CURL 库的选项来实现&#xff0c;代码如下&#xff1a; 当然你要有代理ip来源&#xff0c;比如我用的这个 代理商 &#xff0c;如果想服务稳定不建议找开源代理池&#xff0c;避免被劫持。 <?php // 初始化cURL会话 $ch cu…

xgp会员一年多少钱?xgp一个月多少钱?微软商店xgp会员价格指南

xgp是xbox游戏平台。xgp是类似于steam、epic等&#xff0c;拥有丰富游戏资源的平台。该平 台的全称为“XBox Game Pass”&#xff0c;俗称为“西瓜皮”。xgp是会员订阅模式&#xff0c;开启会员后&#xff0c;所有游戏资源都为你开放。pc版的&#xff0c;第一个月10港币&#x…

基于springboot+vue+Mysql的漫画网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

L1-099 帮助色盲 - java

L1-099 帮助色盲 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 题目描述&#xff1a; 在古老的红绿灯面前&#xff0c;红绿色盲患者无法分辨当前亮起的灯是红色还是绿色&#xff0c;有些聪明人通过路口的策略是这样的&#xff1a;当红灯或绿灯亮起时&am…

WebServer项目介绍文章【四叶专属】

Linux项目实战C轻量级Web服务器源码分析TinyWebServer 书接上文&#xff0c;学习开源项目的笔记没想到居然有不少阅读量&#xff0c;后面结合另一个前端开源项目简单做了点修改&#xff0c;没想到居然有需要的同学&#xff0c;那么我就专门为四叶开一篇文章吧&#xff0c;【源码…

【c++】探究C++中的list:精彩的接口与仿真实现解密

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来到list有关部分&#xff0c;这一部分函数与前面的类似&#xff0c;我们简单讲解&#xff0c;重难点在模拟实现时的迭代器有关实现 目录 1.List介绍2.接…

【网络安全】跨站脚本攻击(XSS)

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、XSS简介 二、XSS漏洞危害 三、XSS漏洞类型 1.反射型XSS 2.存储型XSS 3.DOM型XSS 四、XSS漏洞防御 一、XSS简介 XSS&#xff08;Cross-Site Scripting&#xff09; XSS 被…

Git merge的版本冲突实验

实验目的 发现 两个分支的 相同文件 怎样被修改 才会发生冲突&#xff1f; 实验过程 1.初始状态 现在目前有1.py、2.py两个文件&#xff0c;已经被git管理。现在我想制造冲突&#xff0c;看怎样的修改会发生冲突&#xff0c;先看怎么不会发生冲突。 目前仓库里的版本是这样…

C语言实现简单CRC校验

目录 一、实现题目 二、send模块 三、receive模块 四、运行截图 一、实现题目 二、send模块 #include <stdio.h> #include <string.h>// 执行模2除法&#xff0c;并计算出余数&#xff08;CRC校验码&#xff09; //dividend被除, divisor除数 void divide…

免费SSL证书和付费SSL证书区别在哪

免费SSL证书与付费SSL证书在多个方面存在差异&#xff0c;这些差异主要体现在认证级别、保障金额以及服务范围上。在以下几个方面存在显著区别&#xff1a; 1、验证类型和信任级别&#xff1a; 免费SSL证书&#xff1a;通常只提供域名验证&#xff08;DV&#xff09;级别的证…

实验:使用apache + yum实现自制yum仓库

实验准备 Web服务器端&#xff1a;cenos-1&#xff08;IP&#xff1a;10.9.25.33&#xff09; 客户端&#xff1a;centos-2 保证两台机器网络畅通&#xff0c;原yum仓库可用&#xff0c;关闭防火墙和selinux Web服务器端 ①安装httpd并运行&#xff0c;设置开机自启动 安装…

多模态模型

转换器成功作为构建语言模型的一种方法&#xff0c;促使 AI 研究人员考虑同样的方法是否对图像数据也有效。 研究结果是开发多模态模型&#xff0c;其中模型使用大量带有描述文字的图像进行训练&#xff0c;没有固定的标签。 图像编码器基于像素值从图像中提取特征&#xff0c;…

力扣数据库题库学习(4.23日)

610. 判断三角形 问题链接 解题思路 题目要求&#xff1a;对每三个线段报告它们是否可以形成一个三角形。以 任意顺序 返回结果表。 对于三个线段能否组成三角形的判定&#xff1a;任意两边之和大于第三边&#xff0c;对于这个表内的记录&#xff0c;要求就是&#xff08;x…

Maven基础篇7

私服-idea访问私服与组件上传 公司团队开发流程 本地上传–>repository–>私服 其他成员从私服拿 1.项目完成后发布到私服 在pom文件最后写上发布的配置管理 ​ //写发布的url也就是你发布到哪一个版本&#xff0c;以及写入id ​ ​ 发布的时候&#xff0c;将项…

安装Selenium

安装Selenium 【0】引言 ​ 由于sleenium4.1.0需要python3.7以上方可支持&#xff0c;请注意自己的python版本。 【1】使用Pycharm安装 使用 快捷键 Ctrl Alt S 【2】使用 pip 安装 Python3.x安装后就默认就会有pip&#xff08;pip.exe默认在python的Scripts路径下&…

VUE2版本的仿微信通讯录侧滑列表

<template><!-- Vue模板部分 --><div><div v-for"(group, index) in groupedArray" :key"index" ref"indexcatch"><h2>{{ letter[index] }}</h2><ul><li v-for"item in group" :key&quo…

Notepad++使用SFTP连接虚拟机编辑文档

一.前言 当我们在虚拟机中使用vim编辑有时候不太方便&#xff0c;可以使用远程工具连接进行编辑。 常用的远程连接编辑方式有 vscode下载remote-ssh插件notepad下载nppftp插件finallshell中可以直接打开文件编辑xftp软件 根据个人习惯去选择使用即可。 这里分享一下notepa…