C语言实现base64编解码

本文写给需要用到base64编解码的朋友们,可以作为工具文章,在需要时查阅。

关于什么是base64编解码,度娘比我解释的更清楚。这里只说一下,在一些二进制数据或不可见字符操作不便的情况下(例如http请求参数等),可将这类二进制数据通过base64编码转换为可见字符。当然有编码自然也有对等的解码恢复原始数据。

闲话少叙,代码奉上:

/** Author: 码哥比特*/
#include <stdio.h>
#include <stdlib.h>static char baseMap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";int base64_encode(unsigned char *in, size_t inlen, unsigned char **out, size_t *outlen)
{size_t i, state, j;*outlen = inlen / 3 * 4;if (inlen % 3) (*outlen) += 4;*out = (unsigned char *)calloc(1, *outlen + 1);if (*out == NULL) return -1;unsigned char *o = *out;for (i = 0, state = 0, j = 0; i < inlen; ++j) {if (state == 0) {o[j] = (unsigned char)baseMap[(in[i] >> 2) & 0x3f];state = 1;} else if (state == 1) {if (i+1 >= inlen) {o[j++] = (unsigned char)baseMap[(in[i] & 0x3) << 4];o[j++] = (unsigned char)'=';o[j] = (unsigned char)'=';break;} else {o[j] = (unsigned char)baseMap[((in[i] & 0x3) << 4)|((in[i+1] >> 4) & 0xf)];++i;state = 2;}} else {if (i+1 >= inlen) {o[j++] = (unsigned char)baseMap[((in[i] & 0xf) << 2)];o[j] = (unsigned char)'=';break;} else {o[j++] = (unsigned char)baseMap[((in[i] & 0xf) << 2)|((in[i+1] >> 6) & 0x3)];o[j] = (unsigned char)baseMap[in[++i] & 0x3f];++i;state = 0;}}}return 0;
}int base64_decode(unsigned char *in, size_t inlen, unsigned char **out, size_t *outlen)
{if (inlen % 4) return -1;unsigned char ascii[256] = {0};size_t i, state, j;for (i = 0; i < 64; ++i) {ascii[(unsigned char)baseMap[i]] = i;}*outlen = inlen / 4 * 3;if (in[inlen-1] == '=') --(*outlen);if (in[inlen-2] == '=') --(*outlen);*out = (unsigned char *)calloc(1, *outlen + 1);if (*out == NULL) return -1;unsigned char *o = *out;for (i = 0, state = 0, j = 0; i < inlen; ) {if (state == 0) {o[j] = (ascii[in[i]] << 2);state = 1;++i;} else if (state == 1) {o[j++] |= ((ascii[in[i]] >> 4) & 0x3);state = 2;} else if (state == 2) {o[j] = (ascii[in[i]] & 0xf) << 4;state = 3;++i;} else if (state == 3) {if (in[i] == '=') break;o[j++] |= ((ascii[in[i]] >> 2) & 0xf);state = 4;} else if (state == 4) {o[j] = (ascii[in[i]] & 0x3) << 6;state = 5;++i;} else {if (in[i] == '=') break;o[j++] |= (ascii[in[i]] & 0x3f);state = 0;++i;}}return 0;
}void base64_free(unsigned char *data)
{if (data == NULL) return;free(data);
}

encode/decode函数的参数1、2为输入内容,参数3、4为编解码的结果部分。

如果编解码成功返回值为0,否则返回值为-1。

编解码成功时,参数三将返回一个动态分配的内存空间,因此封装了一个base64_free函数用来释放该部分内存。读者使用时,也可以根据需要将分配和释放内存的方式进行修改。

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

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

相关文章

波特云 集装箱和 海恒蓝 集装箱 自动化集装箱下单方案

背景&#xff1a; 这几天 遇到了一个客户 是做外贸的 需要大量多的集装箱&#xff0c;了解后 他们是需要在平台上 下单集装箱 才有可能预约到集装箱使用&#xff0c;所以公司每天都需要都需要派个人 盯着电脑来 下单集装箱。 波特云 网站&#xff1a;https://www.eportyun.com…

vue-springboot基于JavaWeb的汽配汽车配件销售采购管理系统

过对知识内容的学习研究&#xff0c;进而设计并实现一个基于JavaWeb的汽配销售管理系统。系统能实现的主要功能应包括&#xff1b;汽车配件、销售订单、采购订单、采购入库等的一些操作&#xff0c;ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&…

回首2023: 程序员跳出舒适圈

1 前言 今天的冬日暖阳高照&#xff0c;照耀着我穿着羽绒服的身体&#xff0c;让我感到火一般的燥热&#xff0c;仿佛错觉中已经到了阳春三月。刚刚把孩子洗好&#xff0c;我坐在电脑前&#xff0c;准备整理一下思绪&#xff0c;回顾一下2023年的生活和工作。 2 2023 回顾 回…

STL——排序算法

算法简介 sort ——//对容器内元素进行排序random_shuffle ——//洗牌 指定范围内的元素随机调整次序merge ——// 容器元素合并&#xff0c;并存储到另一容器中reverse ——// 反转指定范围的元素 1.sort 函数原型&#xff1a; sort(iterator beg, iterator end, _Pred);—…

【程序设计】程序设计的七大原则

常言道理论是用来指导实践的&#xff0c;而理论又是通过实践不断检验和修正的结果&#xff0c;理论和实践就是这样相互促进&#xff0c;最后将一个领域推向新的高度。面向对象编程出现的半个多世纪里&#xff0c;设计原则就是在无数前辈的理论和实践中产生的。在我们日常开发中…

SAP 资产管理后台配置之设定主数据字段

前阵子给财务创建了一个固定资产类型&#xff0c;但同事使用时发现字段跟平时不一样。 正常是有下面这些标签页的 然后我找到主数据屏幕格式的配置里发现 发现格式默认错了 应该是默认我司的自定义格式ZSAP 但是改成ZSAP还是不会生效 需要给这个资产分类重新分配一下字段标签页…

vue-springboot基于javaEE的二手手机交易平台的设计与实现

在此基础上&#xff0c;结合现有二手手机交易平台体系的特点&#xff0c;运用新技术&#xff0c;构建了以 SpringBoot为基础的二手手机交易平台信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员、用户…

Vue+elementUI引入MessageUI展示问题

VueelementUI引入MessageUI展示问题 1.出现问题的界面 2.解决问题 import "element-plus/theme-chalk/el-message.css";

nginx加快图片访问速度

&#xff08;一&#xff09;设置压缩 开启gzip和设置压缩类型 测试下:curl -I -H "Accept-Encoding:gzip,deflate" "http://old.cc.cnm/images/201604/index_img/8529_G_1460346831951.jpg" (二&#xff09;图片设置缓存 http层级: proxy_connect_time…

【年度总结 | 2023】稳步前进吧,少年

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

局部线性嵌入(LLE)的代码示例以及详细数学解释

文章目录 局部线性嵌入&#xff08;LLE&#xff09;的数学原理LLE中的重建权重计算示例 LLE降维映射的详细解释LLE降维映射的示例示例数据集降维映射 从LLE的特征值和特征向量到低维数据&#xff08;低维嵌入&#xff09;特征值和特征向量的计算选择特征向量以获得低维表示构建…

探索小红书笔记API:挖掘数据背后的故事

随着数字化时代的到来&#xff0c;数据已经成为企业和个人决策的重要依据。小红书作为一个流行的社交电商平台&#xff0c;积累了大量的用户数据和内容。通过探索小红书笔记API&#xff0c;我们可以深入挖掘这些数据背后的故事&#xff0c;从而更好地理解用户需求和市场趋势。 …

SpringBoot中定义Bean的几种方式

引言 在Spring Boot应用程序中&#xff0c;定义Bean是非常常见的操作&#xff0c;它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean&#xff0c;每种方式都有其适用的场景和优势。本文将介绍Spring Boot中定义Bean的几种常见方式&#xff0c;包括使用Component、…

SpringCloud 和 Linux 八股文第三期五问五答

SpringCloud 和 Linux 八股文第三期五问五答 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;Linux常用命令 2&#xff09;如何查看测试项目的日志 一…

VSCode使用Remote SSH远程连接Windows 7

结论 VSCode Server不能启动&#xff0c;无法建立连接。 原因 .vscode-server 目录中的 node.exe 无法运行。 原因是Node.js仅在Windows 8.1、Windows Server 2012 R2或更高版本上受支持。 由于vscode基于node.js v14&#xff0c;不支持Windows 7操作系统。 另&#xff…

关于苹果iOS 16:揭开伪装成飞机模式的隐形蜂窝接入漏洞的动态情报

一、基本内容 在日常生活中&#xff0c;网络威胁不断演变&#xff0c;给个人和组织带来了一系列重大挑战。网络犯罪分子使用的一种最常见的、最具破坏性的方法之一就是网络钓鱼。这种攻击方式通过电子邮件、短信或其他通讯渠道冒充可信实体&#xff0c;诱使个人泄露敏感信息&am…

Hive表加工为知识图谱实体关系表标准化流程

文章目录 1 对源数据静态文件的加工1.1 分隔符的处理情况1.2 无法通过分隔符以及包围符区分字段1.3 数据中存在回车换行符 2 CSV文件导入Hive的建表2.1 包围符作用和功能2.2 Hive的建表导入2.3 数据文件导入 3 对Hive表中数据的清洗3.1 数据质量检查3.2 标准导图表的构建3.3 随…

从0到1入门C++编程——01 C++基础知识

文章目录 一、工具安装二、新建项目三、设置字体、注释、行号四、C基础知识1.数据类型2.输入输出3.运算符4.选择、循环结构5.跳转语句6.数组7.函数8.指针9.结构体 一、工具安装 学习C使用到的工具是Visual Studio&#xff0c;Visual Studio 2010旗舰版下载链接&#xff1a;点此…

软件测试/测试开发丨Python 内置库 多线程threading

线程基本使用 单线程 def main():print("在扔一个苹果")if __name__ "__main__":main()多线程 Python提供了thread、threading等模块来进行线程的创建与管理&#xff0c;后者在线程管理能力上更进一步&#xff0c;因此我们通常使用threading模块。创建一…

Vue.js和Node.js的关系--类比Java系列

首先我们看一张图 这里我们类比了Java的jvm和JavaScript的node.js。 可以看到&#xff0c;node.js是基础&#xff0c;提供了基础的编译执行的能力。vue,js是实际上定义了一种他自己的代码格式&#xff0c;以加速开发。