base64编码解码器【C++】

2023-11-12

在线编码解码工具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个等号。

 

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

base64编码解码器【C++】 的相关文章

随机推荐

  • pytorch利用resnet50实现cifar10准确率到95%以上

    目录 前言 代码 前言 因为课程需要 老师要求使用resnet18或者resnet50将cifar10训练到精度到达95 试过了网上其他很多方法 发现精度最高的是在预处理化的时候 图片resize到32 32 并且padding 4进行填充
  • elasticsearch 版本 2xx和5xx 及 elasticsearch5.x 新特性

    其实 elasticsearch5 x 和 elasticsearch2 x 并不区别很大 是因为 ELK里之前版本各种很混乱 直接升级到5 0了 其实 elasticsearch5 x 按理来说是elasticsearch3 x 只是为了
  • Pyside6 TableView 显示按钮 - QStyledItemDelegate 简单实现

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 示例代码 效果图 参考链接 示例代码 coding utf 8 import sys from PySide6 QtCore import from PySide6 Q
  • 抓包工具tcpdump用法说明

    tcpdump采用命令行方式对接口的数据包进行筛选抓取 其丰富特性表现在灵活的表达式上 不带任何选项的tcpdump 默认会抓取第一个网络接口 且只有将tcpdump进程终止才会停止抓包 例如 shell gt tcpdump nn i e
  • 关于Java中代码块的执行顺序

    1 概念 代码块 使用 定义的一段代码 根据代码块出现的位置以及关键字不同 分为以下四种代码块 普通代码块 直接定义在方法内部 不加任何修饰符定义的代码块 解决变量重名问题 构造块 直接定义在类中 使用 的代码块 静态代码块 一般用于初始化
  • vue2项目引入vue-video-player

    直接安装npm install vue video player save报错 指定版本 npm install vue video player 5 0 1 save vue video player 其实就是 video js 集成到
  • Spring集成Mybatis时的常见报错

    这两个框架集成的时候最常见的是各种映射文件无法对应而引发的报错 根据不同的报错可以优先检查对应的位置 这样才能快速解决问题 1 找不到mybatis的映射文件 如下图 在定义SqlSessionFactoryBean 要注意对应关系 注意
  • ps太卡怎么办?几步帮您解决问题

    PS是一款非常常用的绘图软件 但是有些小伙伴感觉用PS会卡顿 可是电脑的配置也不是很低 排除PS本身的问题后 这种情况往往和ps里的基础设置有关 下面来看看该如何解决PS卡顿的问题吧 1 停用 主页 屏幕 现在很多小伙伴都用上了新版ps 新
  • 我的程序员之路进行中

    计划看的书 1 Windows程序设计 第5版珍藏版 1104页 2 Windows程序设计 第2版 王艳平 扫描版 490页 3 Windows核心编程 第5版 769页 4 竹林蹊径 深入浅出windows驱动开发 506页 5 Win
  • Mybatis小技巧之使用自动生成的主键值

    文章目录 一 需求 1 编写接口 2 编写mapper配置文件 3 测试程序 4 运行结果 一 需求 在数据库种类似id这样的主键值都是自动增长的 但是如果有这样的需求时 插入一条记录后 自动生成了主键 而这个主键需要在其他表中使用时 此时
  • 关联分析算法(一)——Apriori(先验算法)

    算法思路简介 Apriori根据原始的销售表 第一步 列出所有元素 所有元素独立组成一个集合 计算每个集合的支持度 然后根据最小支持度的阈值剔除掉小的支持度的集合 第二步 每个集合都增加一个与原有集合中没有的元素 构成多个新的集合 计算每个
  • ARM 汇编基础知识

    1 为什么学习汇编 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编 因为 Cortex A 芯片一 上电 SP 指针还没初始化 C 环境还没准备好 所以肯定不能运行 C 代码 必须先用汇编语言设置好 C 环境 比如
  • 容联云通讯完成发送验证码

    容联云通讯完成发送验证码 不是广告 真人编写 学习记录分享而已 容联云通讯官方网站 https www yuntongxun com 进入网站后 找到测试号码 绑定测试的手机号 最多绑定是三个 第二部 查找相关语言demo 以及SDK 点击
  • 后渗透系列之windows文件下载

    后渗透系列之windows文件下载 不知道你们在进行渗透时会不会遇到这样的问题 在进行后渗透时linux系统是可以使用wget命令进行文件下载的 在真实的渗透环境下往往拿到的都只是windows系统的一个命令行 那windows系统怎么做到
  • CentOS 7.5 离线安装 Nginx 1.18

    CentOS 7 5 离线安装 Nginx 1 18 整体情况介绍 准备阶段 安装步骤 详细步骤 准备 安装 整体情况介绍 操作系统 CentOS 7 5 Nginx版本 nginx 1 18 0 tar gz 说明 1 官网推荐的安装方式
  • opencv 脸部识别开源软件

    转自 http baike baidu com link url La63ZsuqOW1YdyW5UAHQ5zDphzSB58 IcC1SUl2Njit4T0frWPrjflJIuk66RydifpPMBJ50HETrZhr5NrhrU O
  • PyCharm2019.1.1社区版安装(Win10)

    PyCharm2019 1 1安装 Win10 使用Python进行开发时 已经安装好Python 我们可以在终端使用Python 也可以用文本编辑器编写代码后然后用Python执行代码 但这些都不是很方便 也不是很智能和不够友好 需要有多
  • ip 子网数目 网络号 主机号 广播地址 可用IP地址范围

    考试中都会给定一个IP地址和对应的子网掩码 让你计算 1 子网数目 2 网络号 3 主机号 4 广播地址 5 可用IP地址范围 综合实例 已知172 31 128 255 18 试计算 1 子网数目 2 网络号 3 主机号 4 广播地址 5
  • Redis持久化机制:AOF和RDB

    前言 我们都知道Redis操作的数据都来源于内存 所以Redis读写速率极快 那为什么我们还需要用到持久化勒 当我们Redis服务器宕机或者Redis进程被kill或者异常退出的时候 如果没有持久化机制将数据保存到磁盘的化 那么之前保存到R
  • base64编码解码器【C++】

    在线编码解码工具https base64 us 所有结果可以使用上述网站检验 什么是base64编码 base64编码是一种编码方式 用64 1 个字符表示字符 本质是将三位8比特字符扩增为四位8比特字符 但是这么说开始可能很闷逼 给个图