base64编码解码器【C++】

article/2025/9/11 4:20:29

在线编码解码工具icon-default.png?t=M85Bhttps://base64.us/所有结果可以使用上述网站检验。


什么是base64编码?

        base64编码是一种编码方式

        用64 + 1 个字符表示字符

本质是将三位8比特字符扩增为四位8比特字符,但是这么说开始可能很闷逼。

给个图,这个编码是以3字节为一个单位进行操作。

        原来的

每个双向箭头为一个单元,每一个单元单独拿出来,在之前(高位)补两位0,重组为8比特。
这样原来的字节就被以一种特殊的方式编码了。
而且高2位是0,所以它的每一字节范围就是 2^6 = 64 这也印证了这个编码的名字 :‘64’编码。

新产生的字符串根据特定的规则进行显示,具体如下:(网上找的)

 好,那为什么我前面说是用 64 + 1 个字符表示呢?

先问个问题,如果说原字符不够3字节怎么办?

想想看

这里的解决方法是全部补零(在原字符上),补齐3字节。

再按照上述操作进行,对于多出来的字符则全部以“=”补充。


下面放代码:

//文件名 base64.h#include<iostream>
#include<cstring>
using namespace std;
对应的字符列表
const char base64List[67] = "AABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
char b[200] = "";
char a[100] = "";void menu();//菜单 
char* enCoder(char* a);//编码器 
char* deCoder(char* bq);//解码器 
#include"base64.h"//JL
int main()
{char en[100] = "";char de[100] = "";int c = 0;char f;int chose = 0;char pos[100] = "";while (1){menu();cin >> chose;switch (chose){case 1:cout << "请输入请输入要进行 Base64 编码的字符";cin >> en;enCoder(en);system("pause");break;case 2:cout << "请输入请输入要进行 Base64 解码的字符";cin >> de;for (int i = 0; i < strlen(de); i++){c = strchr(base64List, de[i]) - base64List;//这里可以得到常字符在列表中的位置if (c == 0) {c = 1;}pos[i] = c;}deCoder(pos);system("pause");break;case 3:cout << "成功退出";exit(-1);break;default:while((f=getchar())!='\n'){};break;}memset(a,0,sizeof(a));memset(b,0,sizeof(b));fflush(stdin);system("cls");}return 0;
}void menu()
{cout << "--------------base64编解码器--------------" << endl;cout << "1.编码(Encode)" << endl;cout << "2.解码(Decode)" << endl;cout << "3.退出(Exit)" << endl;cout << "请输入选项:" << endl;
}
char* enCoder(char* a) {//编码器int i = 0;for (i = 0; i < strlen(a); i = i + 3){int indexb = i / 3;char b1 = (a[i] >> 2) + 1;b[indexb * 4] = b1;char b2 = ((a[i] & 0x03) << 4) | (a[i + 1] >> 4) + 1;b[indexb * 4 + 1] = b2;if (strlen(a) - i == 1) {b[strlen(b)] = 65;b[strlen(b)] = 65;break;}char b3 = ((a[i + 1] & 0x0f) << 2) | (a[i + 2] >> 6) + 1;b[indexb * 4 + 2] = b3;if (strlen(a) - i == 2) {b[strlen(b)] = 65;break;}char b4 = (a[i + 2] & 0x3f) + 1;b[indexb * 4 + 3] = b4;}cout << "Base64 编码的结果:" ;for (int i = 0; i < strlen(b); i++) {cout<< base64List[b[i]];}cout << endl;return b;
}
char* deCoder(char* bq)//解码器
{for (int i = 0; i < strlen(bq); i = i + 4){int indexa = i / 4;char a1 = (bq[i] - 1 << 2) | (bq[i + 1] - 1 >> 4);a[indexa * 3] = a1;if (strlen(bq) - i <= 4 && base64List[bq[strlen(bq) - 2]] == '=') {break;}char a2 = (bq[i + 1] - 1 << 4) | (bq[i + 2] - 1 >> 2);a[indexa * 3 + 1] = a2;if (strlen(bq) - i <= 4 && base64List[bq[strlen(bq) - 1]] == '=') {break;}char a3 = (bq[i + 2] - 1 << 6) | (bq[i + 3] - 1 >> 0);a[indexa * 3 + 2] = a3;}cout << "Base64 解码的结果:" << a << endl;return a;
}

代码逻辑呢?(来自百度百科,我也是看着它做的)

//用更接近于编程的思维来说,编码的过程是这样的:

//第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一//个目标字符。

//然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|),即获得第二个目标字符。

//再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位与前者相或(|),获得第三个目标字符。

//最后将第三个字符与0x3f(00111111)进行与(&)操作即获得第四个目标字符。

//在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。

原文的字节数量应该是3的倍数,如果这个条件不能满足的话,具体的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1变2,2变3;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为一个原字节至少会变成两个目标字节,所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。

 


http://chatgpt.dhexx.cn/article/8gI3rKQs.shtml

相关文章

前端图片在线转换Base64 图片编码Base64

首先讲一下什么是图片Base64编码&#xff1a; 简单来说&#xff0c;图片的base64编码就是可以将一副图片数据编码成一串字符串&#xff0c;使用该字符串代替图像地址。 为什么要用Base64&#xff1f; 我们知道&#xff0c;我们所看到的网页上的每一个图片&#xff0c;都是需…

理解图片base64编码

什么是编码解码 编码&#xff1a;利用特定的算法&#xff0c;对原始内容进行处理&#xff0c;生成运算后的内容&#xff0c;形成另一种数据的表现形式&#xff0c;可以根据算法&#xff0c;再还原回来&#xff0c;这种操作称之为编码。 解码&#xff1a;利用编码使用的算法的…

【HTML5】------- 图片Base64编码详解

引言   图片处理在前端工作中可谓占据了很重要的一壁江山。而图片的 base64 编码可能相对一些人而言比较陌生&#xff0c;本文不是从纯技术的角度去讨论图片的 base64 编码。标题略大&#xff0c;不过只是希望通过一些浅显的论述&#xff0c;让你知道什么是图片的 base64 编码…

记录:Base64编码步骤详解

文章目录 具体转换步骤实例演示&#xff1a;AbC实例演示二&#xff1a;字节数不足三个例&#xff1a;A例&#xff1a;8H ASCII编码表Base64编码表 具体转换步骤 第一步&#xff0c;将待转换的字符串每三个字节分为一组&#xff0c;每个字节占8bit&#xff0c;那么共有24个二进…

对图片进行base64 编码

原文地址&#xff1a;https://www.cnblogs.com/coco1s/p/4375774.html 引言 图片处理在前端工作中可谓占据了很重要的一壁江山。而图片的 base64 编码可能相对一些人而言比较陌生&#xff0c;本文不是从纯技术的角度去讨论图片的 base64 编码。标题略大&#xff0c;不过只是希…

php将图片转成base64编码,利用PHP将图片转换成base64编码的实现方法

利用PHP将图片转换成base64编码的实现方法 先来说一下为什么我们要对图片base64编码 base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一。base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于网络传输。由于这些二进制字符在传输协议中属于控制字…

Hex编码与Base64编码

Hex编码与Base64编码 什么是明文什么是编码Hex编码Hex编码实现细节自定义Hex编码 Base64编码Base64编码实现细节自定义Base64编码 什么是明文 介绍什么是编码之前&#xff0c;首先了解下什么是明文&#xff0c;表示其本身意思的&#xff0c;他就是明文 比如你看到"E6988…

Base64编码linux服务器与网页编码不一致问题

一、起因 在一次环境变量注入的时候&#xff0c;使用Base64将密码编码传入&#xff0c;但是传入后无法登录&#xff0c;但是登录到容器内&#xff0c;使用明文却能登录 二、排错过程 出现这种问题&#xff0c;首先判断密文是否有误&#xff0c;但是在linux服务器内反复base64&…

mysql 图片base64_关于图片的Base64编码

什么是Base64编码 Base64编码是一种图片处理格式,通过特定的算法将图片编码成一长串字符串,在页面上显示的时候,可以用该字符串来代替图片的url属性。 base64编码就是长得像下面这样子的代码: thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg== 上面…

前端Base64编码

Base64编码 什么是Base64编码 我们所看到的网页上的每一个图片&#xff0c;都是需要消耗一个 http 请求下载而来的&#xff0c;不管如何&#xff0c;图片的下载始终都要向服务器发出请求&#xff0c;要是图片的下载不用向服务器发出请求&#xff0c;而可以随着 HTML 的下载同…

图片Base64编码

图片处理在前端工作中可谓占据了很重要的一壁江山。而图片的 base64 编码可能相对一些人而言比较陌生&#xff0c;本文不是从纯技术的角度去讨论图片的 base64 编码。标题略大&#xff0c;不过只是希望通过一些浅显的论述&#xff0c;让你知道什么是图片的 base64 编码&#xf…

什么是Base64 编码,Base64 编码有哪些优缺点?

很多朋友在工作中&#xff0c;可能经常会用到Base64编码。Base64编码是网络上很常见的用于8Bit字节码的编码方式之一&#xff0c;那么&#xff0c;大家知道为什么要使用Base64 编码&#xff0c;Base64 编码有哪些优缺点呢&#xff1f;下面&#xff0c;我们一起来研究一下。 什…

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

原文: https://juejin.cn/post/6989391487200919566 作者: 云的世界 掘金专栏: 前端基础进阶 大厂技术 高级前端 Node进阶 点击上方 程序员成长指北&#xff0c;关注公众号 回复1&#xff0c;加入高级Node交流群 前言 本文将详细的介绍前端 Base64 编码知识&#xff0c;探索…

Python模板库Mako的语法

原文链接&#xff1a;http://www.yeolar.com/note/2012/08/28/mako-syntax/ Mako模板从一个包含各种类型的内容的文本流解析得到&#xff0c;包括XML、HTML、email文本等。模板还可以包含Mako指令&#xff0c;用来表示变量和表达式替换、控制结构、服务器端注释、整块Python代码…

Django mako 的使用(七)

Django mako 的使用 6.6 mako 的使用 6.6 mako 的使用 安装 mako pip install mako 创建子应用 makos python .\manage.py startapp makos 创建 base_render.py 文件 from django.http import HttpResponse from django.template import RequestContext from django.templat…

mako模版库实践

介绍 这几天在编写一个数据驱动测试框架&#xff0c;其中一个核心模块是根据数据输入&#xff0c;自动转换为测试用例代码。测试数据格式固定&#xff0c;对应的用例代码结构也相对稳定。基于此场景&#xff0c;联想到web页面根据数据从template渲染页面&#xff0c;决定使用类…

Django——mako的配置与使用方法

一、前言 mako最大的特点就是允许在HTML中随意书写Python代码&#xff0c;挺起就很心动啊&#xff01;&#xff01; 二、准备阶段 新建一个项目mako_project&#xff0c;再新建一个app叫app&#xff0c;然后安装mako&#xff08;要联网安装&#xff09; pip install mako然…

Xen新特性

4.0 为了增强主机层面的性能和可扩展性&#xff0c;新的Xen 4.0虚拟机管理程序现在横跨主机服务器上的128(之前64 )个物理处理器&#xff0c;最多可以处理1TB的物理主系统内存。在访客环境中&#xff0c;基于Xen 4.0运行的虚拟机现在可以分配给多达128个虚拟处理器/VCPU(不过…

Xen - Networking

Xen - Networking Step 0 : Xen底下的網路架構 Step 1 : 虛擬還是實體 Step 2 : network-bridge Step 3 : network-nat Step 4 : network-route Step 5 : 參考網頁 Step 0 : Xen底下的網路架構 在虛擬化下的環境就屬網路裝置最為複雜難懂,不過模式大致可以畫分成 3 種 1.netw…

Xen虚拟化之一:Xen环境组件详解

Xen是一个开放源代码虚拟机监视器(Virtual Machine Monitor&#xff0c;简称为VMM)&#xff0c;由剑桥大学开发&#xff0c;它致力于实现在单个计算机上运行多达128个有完全功能的操作系统。Xen通过一种叫做半虚拟化(paravirtualization)的技术获得高效能的表现&#xff08;较少…