《编程思维与实践》1047.Base64编码

news2024/11/23 18:49:41

《编程思维与实践》1047.Base64编码

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

直接模拟:将每个Base64编码值都分为两部分:前半部分由上一个字符求得,后半部分由下一个字符求得.
特别地,如果字符为第一个或最后一个,则直接可以求得Base64编码.
如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中,% 2 n 2^n 2n表示取出后n位的二进制位,

这是因为 N   %   2 n = ( 2 k + 2 k − 1 + . . . + 2 + 2 0 )   %   2 n = 2 n − 1 + . . . + 2 + 2 0 N\,\%\,2^n=(2^{k}+2^{k-1}+...+2+2^0)\,\%\,2^n=2^{n-1}+...+2+2^0 N%2n=(2k+2k1+...+2+20)%2n=2n1+...+2+20;

注意到如果字符总数为3的倍数,则Base编码数为4的倍数,

所以为了满足字符总数为3的倍数,需要在不满4倍数的编码数后添加’='对应的编码(不妨记为64),

之后只需要遍历字符串即可,每读三次更新一轮.

注意的点:

1.读取前半部分时指标不需要++,读取后半部分时才++,特别地,处于开头或者最后一个字符时,需要直接++;

2.需要补’=‘的情况只有非3的倍数的情况,由于读取编码前半部分时指标没有++,所以补’='时需要++;

代码

#include<stdio.h>
#include<string.h>

char chart[66]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="};  //'='编码记为64

int main()
{
	int T;
	scanf("%d",&T);
	for(int t=0;t<T;t++)
	{
		char s[101];
		scanf("%s",s);
        char ans[300];  //answer 存Base64编码
		printf("case #%d:\n",t);
        int j=0,cnt=0;  //j为ans指标   cnt记录读几个字符
		for(int i=0;i<strlen(s);i++) 
		{
            if(cnt==0) //处理每三个字符中的第一个
            {
                ans[j++]=s[i]>>2;      //第一个Base64 开头直接++
                ans[j]=(s[i]%4)<<4;    //第二个Base64的前半部分
            }
            else if(cnt==1) //处理第二个
            {
                ans[j++]+=s[i]>>4;   //第二个Base64的后半部分
                ans[j]=(s[i]%16)<<2;  //第三个Base64的前半部分  
            }
            else	//处理第三个
            {
                ans[j++]+=s[i]>>6;   //第三个Base64的后半部分 
                ans[j++]=s[i]%64;	//第四个Base64 最后一个也++ 
            }
            cnt=(++cnt)%3;    //注意这里要先自增再模3 每3次cnt更新重置为0
		}
        if(cnt==1)   //剩一个字符
        {
            j++;    //因为只读前半部分没有++ 所以需要人为++
            ans[j++]=64;   //补两个'='
            ans[j++]=64;
        }
        else if(cnt==2)  //剩两个字符
        {
            j++;  //因为只读前半部分没有++ 所以需要人为++
            ans[j++]=64;
        }
        for(int i=0;i<j;i++)
        {
            printf("%c",chart[ans[i]]);   //按编码输出对应的字符
        }
        printf("\n");
	}
	return 0;
}

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

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

相关文章

专业游戏录屏软件Camtasia 2023强悍来袭,Camtasia Studio 2023的新增功能!

Camtasia Studio 2023是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等&#xff0c;另外&#xff0c;它还具有即时播放和编 辑压缩的功能&#xff0c;可对视频片段进行剪接、添加转场…

又一起数据泄露事件五个月内的第二次

据报道&#xff0c;T-Mobile 在发现攻击者从 2023 年 2 月下旬开始的一个多月内访问了数百名客户的个人信息后&#xff0c;披露了 2023 年的第二次数据泄露事件。 与之前报告的数据泄露事件&#xff08;最近一次影响了 3700 万人&#xff09;相比&#xff0c;此次事件仅影响了…

Linux一学就会——编写自己的shell

编写自己的shell 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行…

Node.js 是什么?

简介 Node.js入门指南&#xff0c;服务器端JavaScript运行时环境。Node.js是在Google Chrome V8 JavaScript引擎的基础上构建的&#xff0c;它主要用于创建web服务器&#xff0c;但并不局限于此。 实际上Node.js 是把运行在浏览器中的js引擎抽离处理&#xff0c;进行再次封装…

MagicaCloth2安装教程

您可访问官网查看详情&#xff1b; MagicaSoft Unity Assets – Magica Soft 也可通过我的资源文件获得此插件的详细教程&#xff1a; (19条消息) UnityMagicaCloth2插件中文文档&#xff08;机翻/部分&#xff09;-Unity3D文档类资源-CSDN文库 MagicaCloth2是基于ECS开发的…

水质信息监测与管理系统

1.1 系统总体设计 1.1.1 系统组成 水质信息监测与管理系统由水质监测站网管理、水质监测数据管理、水质分析评价、水质监测资料整汇编、水质信息查询、水质信息发布等组成。 水质监测站网管理主要实现对各类监测站网&#xff08;固定监测站网、自动监测站网、动态监测站网&a…

Party Again!转录组+LC代谢组=899/组!

转录组代谢组&#xff0c;是基于代谢组和转录组数据&#xff0c;开展表达基因&#xff08;mRNA&#xff09;与代谢物的相关性分析。可实现差异代谢物与时序表达的差异基因的共表达分析&#xff0c;构建核心调控网络机制&#xff0c;找出其中的关键候选基因&#xff0c;揭示表型…

前端001_初始化数据库管控管理系统

数据库管控管理系统采用 Vue.js ElementUI 来搭建系统的前端。 1、技术栈 技术名说明vue.js前端vuex状态管理器mockjs模拟后台apiaxios拦截器echart图标element-ui组件库vue-element-admin脚手架&#xff0c;原始参照的项目模版mavon-editormarkdown编辑器 2、ElementUI 简…

用DG备库做的rman备份恢复一个数据库

环境描述&#xff1a; 1.因为主库存储空间不足&#xff0c;于是将备份放在dg备库上做。 2.主库因为磁盘空间问题&#xff0c;数据文件有两个目录。 3.dg备库因为主库两个数据文件目录里面有两个同名数据文件&#xff0c;所有dg备库也有两个数据文件目录。 4.主库与备库与测…

Grafana 系列-统一展示-1-开篇

系列文章 Grafana 系列文章 Grafana 简介 Grafana 是 Grafana Labs 的第一款也是最重要的产品。它的定位是可视化, 用于监控展示 和 可观察性. 是当前最为完善、流行的云原生、公有云和企业监控可视化平台。 Dashboard anything. Observe everything 无论你的数据存储在哪…

从 PC 解锁 Android 手机的 6 种有效方法

在这个数字时代&#xff0c;手机已成为我们生活的重要组成部分。我们将它们用于各种用途&#xff0c;从跟踪我们的工作和社交日程到与亲人交流。 然而&#xff0c;有时我们的手机会成为令人沮丧的源头&#xff0c;尤其是当我们不小心将自己拒之门外时。但是您知道可以使用计算…

基于SpringBoot+Vue实现的酒店管理系统

【简介】 基于springbootvue实现的酒店管理系统&#xff0c;用于酒店客房业务管理与酒店内部管理。 【功能结构】 【技术架构】 后端&#xff1a;springbootmybatis 前端&#xff1a;vue element-ui 环境&#xff1a;mysqlmaven node 【代码结构与数据库】 【功能详述】…

LeetCode232. 用栈实现队列

232. 用栈实现队列 描述示例解题思路以及代码 描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop()…

UICollectionView 实现整页翻动(每页3个cell)

提示&#xff1a;页面架构是通过UICollectionView做的分页&#xff0c;分页点PageControl使用的是<SDCycleScrollView/TAPageControl.h> &#xff0c;布局架构使用的是Masonry 前言 为了实现UICollectionView无限翻动&#xff0c;连续滑动&#xff0c;主要是利用pagingE…

海豚1.3单节点,多集群设置

最近出差忙项目&#xff0c;一直没更新&#xff0c;现在项目结尾了。回来继续搞集群 公司因为CDH升级为CDP&#xff0c;两套环境数据和任务慢慢迁移&#xff0c;但是调度任务需要同时跑批。 而我们的海豚调度是单节点的&#xff0c;master和worker等服务都在一台节点上。 之前…

基于VBA实现成绩排序的最佳方法-解放老师的双手

作为一名老师&#xff0c;每到期末就要面对一件让人头疼的事情——成绩表统计。 首先&#xff0c;要收集每个学生的考试成绩。这需要花费大量的时间和精力&#xff0c;因为每个学生都有多门科目的成绩需要统计。 其次&#xff0c;要将每个学生的成绩录入到电子表格中。这看起来…

【今天聊聊生产力】提升研发生产力的神器推荐

1、Free Mybatis Tool、MybatisX 用于DAO层和Mapper层之间跳转 Mapper和DAO层跳转&#xff0c;可以用的插件比较多&#xff0c;比较推荐如下两款&#xff0c;功能基本一致&#xff0c;只是样式小有差别。 Free Mybatis Tool&#xff0c;样式为一个绿色箭头&#xff0c;简洁明了…

docker 部署JAVA应用OOM的排障经历——筑梦之路

故障现象&#xff1a; 使用docker部署JAVA的应用&#xff0c;tomcat作为中间件容器&#xff0c;启动应用时总是报错无法创建Java虚拟机&#xff0c;然后就是OOM 报错信息&#xff1a; 不管是从docker容器的日志还是系统日志均未发现有用的信息&#xff0c;也尝试更换过镜像tom…

C++入门3(C++新特性 using string auto)

C入门3 C新特性auto推导规则auto 作为函数的形参类型decltype基于范围for循环 typedef与usingC语言定义变量typedef 在C语言中的写法using在C11中的写法using与template的结合 string的简单使用 C新特性 auto推导规则 auto类型推导: auto定义的变量&#xff0c;可以根据初始化…

开源推荐,超级棒的云原生的Kafka管控平台,清新优雅~~

哈喽&#xff0c;大家好&#xff0c; 之前给大家介绍过很多优秀的后台管理系统&#xff0c;但是都感觉还少&#xff0c;今天再来推荐一个。 最近新接触到一个项目&#xff0c;确实把我惊艳到了&#xff0c;太适合使用了&#xff0c;极大地方便了用户和运维人员的日常使用&…