文档章节

C++ base64编解码

RogerLee
 RogerLee
发布于 2016/11/24 16:13
字数 406
阅读 6
收藏 0
static std::string base64_chars = 
	"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	"abcdefghijklmnopqrstuvwxyz"
	"0123456789+/";
 
 
static bool is_base64(unsigned char c) {
	return (isalnum(c) || (c == '+') || (c == '/'));
}
 
std::string base64_encode(const unsigned char* bytes_to_encode,unsigned int in_len);
int base64_decode(std::string const& encoded_string,unsigned char* pObject);
 
std::string base64_encode(const unsigned char* bytes_to_encode,unsigned int in_len)
{
	std::string ret;
	int i = 0;
	int j = 0;
	unsigned char char_array_3[3];
	unsigned char char_array_4[4];
 
	while (in_len--) {
		char_array_3[i++] = *(bytes_to_encode++);
		if (i == 3) {
			char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
			char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
			char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
			char_array_4[3] = char_array_3[2] & 0x3f;
 
			for(i = 0; (i <4) ; i++)
				ret += base64_chars[char_array_4[i]];
			i = 0;
		}
	}
 
	if (i)
	{
		for(j = i; j < 3; j++)
			char_array_3[j] = '\0';
 
		char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
		char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
		char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
		char_array_4[3] = char_array_3[2] & 0x3f;
 
		for (j = 0; (j < i + 1); j++)
			ret += base64_chars[char_array_4[j]];
 
		while((i++ < 3))
			ret += '=';
 
	}
 
	return ret;
 
}
 
int base64_decode(std::string const& encoded_string,unsigned char* pObject)
{
	int in_len = encoded_string.size();
	int i = 0;
	int j = 0;
	int in_ = 0;
	int iNum = 0;
	unsigned char char_array_4[4], char_array_3[3];
	std::string ret;
 
	while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
		char_array_4[i++] = encoded_string[in_]; in_++;
		if (i ==4) {
			for (i = 0; i <4; i++)
				char_array_4[i] = base64_chars.find(char_array_4[i]);
 
			char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
			char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
			char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
 
			for (i = 0; (i < 3); i++)
			{
				ret += char_array_3[i];
				iNum++;
			}
			i = 0;
		}
	}
 
	if (i) {
		for (j = i; j <4; j++)
			char_array_4[j] = 0;
 
		for (j = 0; j <4; j++)
			char_array_4[j] = base64_chars.find(char_array_4[j]);
 
		char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
		char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
		char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
 
		for (j = 0; (j < i - 1); j++)
		{
			ret += char_array_3[j];
			iNum++;
		}
	}
 
	memcpy(pObject,ret.c_str(),iNum);
	return iNum;
}

© 著作权归作者所有

共有 人打赏支持
RogerLee
粉丝 2
博文 3
码字总数 1204
作品 0
武汉
程序员
私信 提问
讲讲网络模块里加解密那点儿事--AES+BASE64

这次想来讲讲网络安全通信这一块,也就是网络层封装的那一套加密、解密,编码、解码的规则,不会很深入,但会大概将这一整块的讲一讲。 之所以想写这篇,是因为,最近被抽过去帮忙做一个 C+...

请叫我dasu
08/06
0
0
讲讲网络模块中加解密那点儿事--AES+BASE64

这次想来讲讲网络安全通信这一块,也就是网络层封装的那一套加密、解密,编码、解码的规则,不会很深入,但会大概将这一整块的讲一讲。 之所以想写这篇,是因为,最近被抽过去帮忙做一个 C+...

请叫我大苏
08/04
0
0
libb64 1.2.1 发布,C语言的Base64编解码

libb64 1.2.1 修复了 src/cdecode.c 中存在的 bug,增加了一些简单的例子。 libb64 是一个 ANSI C 库,用于实现快速的 BASE64 的编码和解码,包含 C++ 的封装版本。...

oschina
2013/06/29
1K
1
C/C++ Base64解码器

Base64被广泛用于xml类型的文档中,通过实现编码和译码,可以练习一下c++ 首先,我们要知道什么是Base64编码。它是把二进制文件存储成为文本文件后的文件的编码,它是64位进制的编码,所以对...

李三乎
2012/09/04
0
0
邮件客户端编程(pop和smtp)

环境:xp系统,vc6.0、c语言 这里是代码的草稿,原本设计的结构跟现在撸出来的结构相差比较大 实现的部分: smtp协议,可以完成最简邮件格式的发送,收件人可以正常收到 base64编码,可以完成...

古语
2014/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现

作者 | Spring Cloud Alibaba 高级开发工程师洛夜 来自公众号阿里巴巴中间件投稿 前段时间 Hystrix 宣布不再维护之后(Hystrix 停止开发。。。Spring Cloud 何去何从?),Feign 作为一个跟 ...

Java技术栈
4分钟前
1
0
虚拟机加密

在超融合的基础设施和虚拟化成为常态的世界里,对加密的要求越来越高,越来越迫切,IT部门需考虑的重大安全问题和方法也浮现了出来。 物理数据中心时代,采取双保险式数据安全方法是相对简单...

linuxCool
8分钟前
0
0
MySQL 主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

野雪球
20分钟前
0
0
OSChina 周一乱弹 —— 温柔的人应该这样

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @clouddyy :#每日一歌# 《フィクション-sumika》 《フィクション-sumika》 手机党少年们想听歌,请使劲儿戳(这里) 假期时间干嘛去, @for...

小小编辑
今天
156
7
[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部