C语言base64编解码

base64码简介

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

 0. 源数据都是8位位宽的数据;
 1. 相当于分组码,将源数据分为3个一组,每一组共24bits,采用每6位对应一个编码码字,那么3*8bits = 4*6its, 将3个数据映射成4个数据,由于编码的码字都是6位长度,换位10进制就是0-63,总共有64中可能性,这也是base64名字的来历;
 2. 6bits对应10进制数对应的码字如最后的表;
 

 

C代码

编码

#include <stdio.h>
#include <string.h>// 全局常量定义
const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const char padding_char = '=';/*编码代码
* const unsigned char * sourcedata, 源数组
* char * base64 ,码字保存
*/
int base64_encode(const unsigned char * sourcedata, char * base64)
{int i=0, j=0;unsigned char trans_index=0;    // 索引是8位,但是高两位都为0const int datalength = strlen((const char*)sourcedata);for (; i < datalength; i += 3){// 每三个一组,进行编码// 要编码的数字的第一个trans_index = ((sourcedata[i] >> 2) & 0x3f);base64[j++] = base64char[(int)trans_index];// 第二个trans_index = ((sourcedata[i] << 4) & 0x30);if (i + 1 < datalength){trans_index |= ((sourcedata[i + 1] >> 4) & 0x0f);base64[j++] = base64char[(int)trans_index];}else{base64[j++] = base64char[(int)trans_index];base64[j++] = padding_char;base64[j++] = padding_char;break;   // 超出总长度,可以直接break}// 第三个trans_index = ((sourcedata[i + 1] << 2) & 0x3c);if (i + 2 < datalength){ // 有的话需要编码2个trans_index |= ((sourcedata[i + 2] >> 6) & 0x03);base64[j++] = base64char[(int)trans_index];trans_index = sourcedata[i + 2] & 0x3f;base64[j++] = base64char[(int)trans_index];}else{base64[j++] = base64char[(int)trans_index];base64[j++] = padding_char;break;}}base64[j] = '\0'; return 0;
}

解码

包括两个函数:

/** 在字符串中查询特定字符位置索引
* const char *str ,字符串
* char c,要查找的字符
*/
inline int num_strchr(const char *str, char c) // 
{const char *pindex = strchr(str, c);if (NULL == pindex){return -1;}return pindex - str;
}
/* 解码
* const char * base64 码字
* unsigned char * dedata, 解码恢复的数据
*/
int base64_decode(const char * base64, unsigned char * dedata)
{int i = 0, j=0;int trans[4] = {0,0,0,0};for (;base64[i]!='\0';i+=4){// 每四个一组,译码成三个字符trans[0] = num_strchr(base64char, base64[i]);trans[1] = num_strchr(base64char, base64[i+1]);// 1/3dedata[j++] = ((trans[0] << 2) & 0xfc) | ((trans[1]>>4) & 0x03);if (base64[i+2] == '='){continue;}else{trans[2] = num_strchr(base64char, base64[i + 2]);}// 2/3dedata[j++] = ((trans[1] << 4) & 0xf0) | ((trans[2] >> 2) & 0x0f);if (base64[i + 3] == '='){continue;}else{trans[3] = num_strchr(base64char, base64[i + 3]);}// 3/3dedata[j++] = ((trans[2] << 6) & 0xc0) | (trans[3] & 0x3f);}dedata[j] = '\0';return 0;
}

 

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

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

相关文章

学号 20175212 《Java程序设计》第3周学习总结

学号 20175212 《Java程序设计》第3周学习总结 教材学习内容总结 一、 Java——面向对象语言 核心内容为对象&#xff0c;一切围绕着对象。以下为三个重要性质&#xff1a; 封装性&#xff1a;将数据和对数据的操作封装在一起。继承&#xff1a;子类可以继承父系的属性和行为。…

简析EDMX文件的构成 - CSDL、SSDL、MSL

To be done…转载于:https://www.cnblogs.com/5kuai/archive/2010/01/24/1655141.html

Cocos2d开发1:Xcode与TexturePacker的集成

2019独角兽企业重金招聘Python工程师标准>>> 一、导读 这是一篇关于xcode与TexturePacker集成的文章&#xff0c;主要说明cocos2d-iphone/cocos2d-x游戏开发时如何进行图片资源的自动化管理。在进行游戏开发时&#xff0c;我们为了提升性能及减少游戏安装包的大小&…

Boost智能指针——boost::scoped_ptr(使用及原理分析)

简介 boost::scoped_ptr是一个比较简单的智能指针&#xff0c;它能保证在离开作用域之后它所管理对象能被自动释放。下面这个例子将介绍它的使用&#xff1a; 1 #include <iostream>2 #include <boost/scoped_ptr.hpp>3 4 using namespace std;5 6 class Book7 {8 …

文件辅助类封装

using System;using System.Collections.Generic;using System.IO;using System.Text; namespace Manjinba.Communication.Common.Utils{ /// <summary> /// 文件辅助类 /// </summary> public class FileHelper { #region 检测指定目录是否存在 /// <summary&…

你知道吗…我不知道…你知道吗

很多你自以为知道却不知道的东西&#xff0c;你知道吗…我不知道…你知道吗…… 1.拉斯维加斯的赌场都没有钟。 2.麦当劳40%的利润来自Happy Meals的销售。 3.1996版的韦伯斯特词典有315处拼写错误。 4.每天平均有12个新生儿被交给错误的父母。 5.巧克力对于狗来说是致命的&…

c# 读取记事本txt文档到DataTable中

有时候我们仅仅需要用到简单的几个数据,没有必要在数据库中建立单独的表去存储这些数据然后去连接数据库等等。 例如&#xff1a;我们的程序中只需要给几个人定时发送邮件&#xff0c;而这几个人的邮件地址则可以放到txt文档中,然后读取出来即可。 从txt读取出来的数据&#xf…

通读教材第二问

我在教材第14章看到这样一段话&#xff1a;在专业时间模型中&#xff0c;一个Scrum团队负责开发项目的Product Backlog&#xff0c;同时还负责专门的时间来处理现有产品或者服务出现的问题。 请问&#xff1a;在团队项目开发中&#xff0c;专业时间模型是什么&#xff1f; 在查…

智能指针对比

智能指针对比&#xff1a; (1)、boost::shared_ptr<T> -- 基于引用计数器refcount(原子的) <1>、构造函数中refcount1&#xff0c;析构函数中refcount-1&#xff0c;当refcount的值减到为0时&#xff0c;该对象就会被销毁。 <2>、解决循环引用的问题&#x…

魔兽争霸3地图(WarIII Maps):梦若流星

魔兽争霸3地图&#xff08;WarIII Maps&#xff09;&#xff1a;梦若流星梦若流星游戏类型&#xff1a;RPG通关时间&#xff1a;30分钟流星蝴蝶剑后传&#xff0c;即使孟星魂想独善其身&#xff0c;也未必就能如愿………………为了更好的体验游戏&#xff0c;请在在“选项—声音…

Sql Server 关于整表插入另一个表部分列的语法以及select 语句直接插入临时表的语法 (转帖)...

语法是这样的 :1、说明&#xff1a;复制表(只复制结构,源表名&#xff1a;a 新表名&#xff1a;b) (Access可用) 法一&#xff1a;select * into b from a where 1 <>1 法二&#xff1a;select top 0 * into b from a 2、说明&#xff1a;拷贝表(拷贝数据,源表名&#xf…

在.Net中,如何创建一个后台执行的进程?

在.Net中&#xff0c;创建一个进程十分容易。但是如果你想创建一个没有窗口的后台进程&#xff0c;你需要对ProcessStartInfo进行一些特殊的设置&#xff1a; var process new Process() { StartInfo new ProcessStartInfo("executable file name", "argument…

WorldWind Java 版学习:1、启动过程

一、JOGL使用介绍 使用 JOGL&#xff0c;需要构造GLCapabilities、GLCanvas 和 GLEventListener 的对象&#xff0c;其中 GLCapabilities 对象用于构造 GLCanvas 对象&#xff0c;将 GLCanvas 添加到相应的 Container 中用于窗口显示&#xff0c;实现 GLEventListener 中的init…

Redis pub/sub机制在实际运用场景的理解(转载)

Redis 的pub/sub机制与23种设计模式中的观察者设计模式极为类似。但Redis对于这个机制的实现更为轻便和简结&#xff0c;没有观察者模式的那么复杂的逻辑考虑而仅仅需要通过两个Redis客户端配置channel即可实现&#xff0c;因此它也仅仅做了消息的"发布"和"订阅…

第三周学习进度总结

本周学习进度&#xff1a; 第三周3月11日至3月17日每天平均写代码时间30分钟代码量630行左右所发博客数6篇本周学到的知识点对HTMLcss的常用知识点有了大概的了解&#xff0c;对java的文件操作更加熟练了下周的计划熟练掌握本周学到的知识点&#xff0c;简单了解安卓手机端开发…

flash特效原理:图片滑动放大效果(2)

flash特效原理&#xff1a;图片滑动放大效果(1) http://blog.csdn.net/hero82748274/archive/2009/10/22/4715312.aspx 最近看了一些关于动态注册点更加的办法&#xff0c;顺手牵羊把他下载了&#xff0c;感觉挺好用。再把一个倒影类给下载了&#xff0c;结合上次一个做法&…

Windows Phone 7实现图片数据绑定

Windows Phone 7实现图片数据绑定 首先我们使用ListBox来显示多张图片&#xff0c;然后在建立一个单独的页面来显示单独的一张图片。 1.我们建立一个Picture.xaml的页面&#xff0c;并使用ListBox控件来显示多张图片的信息。&#xff0c;示例代码如下&#xff1a; <Grid x:N…

类前置声明的使用

今天在写代码时&#xff0c;遇到了是否需要加头文件的问题&#xff0c;看到这个博客之后收益匪浅&#xff0c;因此转载该篇文章。 转载&#xff1a;https://www.jianshu.com/p/9768175387b6 首先我们看这样一个示例程序: 以上代码中,类CY中有个CX类型的数据成员,我们需要在CY…

dom nodeName nodeType nodeValue

1&#xff0c;nodeName属性 &#xff1a; 节点的名字。如果节点是元素节点&#xff0c;那么返回这个元素的名字。此时&#xff0c;相当于tagName属性。比如<p>aaaa</p> : 则返回 p 如果是属性节点&#xff0c;nodeName将返回这个属性的名字。如果是文本节点&…

谈谈CLOSE_WAIT

TCP 有很多连接状态&#xff0c;每一个都够聊十块钱儿的&#xff0c;比如我们以前讨论过 TIME_WAIT 和 FIN_WAIT1&#xff0c;最近时不时听人提起 CLOSE_WAIT&#xff0c;感觉有必要梳理一下。 所谓 CLOSE_WAIT&#xff0c;借用某位大牛的话来说应该倒过来叫做 WAIT_CLOSE&…