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; 互斥锁 逻…

c# 连接数据库、excel数据批量导入到数据库

string str $"select from TBa where ... ";DataSet ds new DataSet();using (SqlConnection conn new SqlConnection("server000.000.0.000;database数据库名;user id登录的用户名;password密码;Poolingtrue")){try{conn.Open();SqlCommand com new Sq…

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

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

设计模式- 享元模式(Flyweight Pattern)结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

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

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

php序列化存储和反序列化的使用方法

在 PHP 中,序列化(serialization)是将一个变量转换为可存储或传输的字符串表示形式的过程。反序列化(unserialization)则是将这个字符串转换回原始的 PHP 变量。这在存储对象到数据库、缓存系统或者在网络中传输对象时非常有用。 序列化 PHP 提供了 serialize() 函数来序…

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;…

前端分页请求数据,前端删除n条数据后,再次请求

期望实现 前端分页请求服务端数据&#xff0c;页面渲染成列表前端操作删除列表里一项或多项&#xff08;一条或多条数据&#xff09;&#xff0c;页面立刻移除这一项或多项前端再次分页请求服务端数据&#xff0c;列表正常显示 问题分析 一般来说&#xff0c;每次请求的数据…

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;【源码…

抢先看!美团、京东、360等大厂面试题解析,技术面试必备。

技术面试必备&#xff01;美团、京东、360等大厂面试题详解&#xff0c;让你轻松应对各大公司面试挑战&#xff01; 往期硬核面经 哦耶&#xff01;冲进腾讯了&#xff01; 牛逼&#xff01;上岸腾讯互娱和腾讯TEG&#xff01; 腾讯的面试&#xff0c;强度拉满&#xff01; …

【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 被…

信奥之路(三)——判断语句if

1.if语句 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句。 C 编程语言提供了以下类型的判断语句。点击链接查看每个语句的细节&#xff1a; if 语句&#xff1a;一个 if …

设计模式(019)行为型之状态模式

状态模式是一种行为型设计模式&#xff0c;它允许对象在内部状态发生变化时改变它的行为&#xff0c;使得对象在不同状态下有不同的行为表现&#xff0c;而且可以方便地添加新的状态而不必修改已有的代码。 1、场景设计 实现场景&#xff1a;对状态A和状态B做出不同的处理。 …

Git merge的版本冲突实验

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

C++ //练习 13.11 为前面练习中的HasPtr类添加一个析构函数。

C Primer&#xff08;第5版&#xff09; 练习 13.11 练习 13.11 为前面练习中的HasPtr类添加一个析构函数。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 class HasPtr{ public:HasPtr(const std::string &s std::stri…

C语言实现简单CRC校验

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