C/C++中使用Base64编码解码(使用boost库)

2023-10-29

Base64是一种用64个字符来表示任意二进制数据的方法。
用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。
Base64是一种基于64个可打印字符来表示二进制数据的表示方法,从本质上看Base64编码就是将三字节转四字节,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。

如将字符串“Man”用Base64编码。


如果数据的长度不是3的整数倍,就要在后面补0再计算,每补2个0就在Base64串后加上1个‘=’。


Base64编码表如下:

 

Base64的不足之处

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。


由于boost库良好的封装,所以使用boost来完成Base64编码解码非常方便,下面直接上代码了:

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
using namespace boost::archive::iterators;

bool Base64Encode( const string & input, string * output )
{
	typedef base64_from_binary<transform_width<string::const_iterator, 6, 8>> Base64EncodeIterator;
	stringstream result;
	try {
		copy( Base64EncodeIterator( input.begin() ), Base64EncodeIterator( input.end() ), ostream_iterator<char>( result ) );
	} catch ( ... ) {
		return false;
	}
	size_t equal_count = (3 - input.length() % 3) % 3;
	for ( size_t i = 0; i < equal_count; i++ )
	{
		result.put( '=' );
	}
	*output = result.str();
	return output->empty() == false;
}

bool Base64Decode( const string & input, string * output )
{
	typedef transform_width<binary_from_base64<string::const_iterator>, 8, 6> Base64DecodeIterator;
	stringstream result;
	try {
		copy( Base64DecodeIterator( input.begin() ), Base64DecodeIterator( input.end() ), ostream_iterator<char>( result ) );
	} catch ( ... ) {
		return false;
	}
	*output = result.str();
	return output->empty() == false;
}

int _tmain(int argc, _TCHAR* argv[])
{
	cout << "C/C++中使用Base64编码解码(使用boost库)" << endl;

	string input_str("http://blog.csdn.net/qq0824?viewmode=contents");
	string base64_str, output_str;

	cout << "origin text: \n" << input_str << endl;

	Base64Encode(input_str, &base64_str);
	cout << "encode: \n" << base64_str << endl;

	Base64Decode(base64_str, &output_str);
	cout << "decode: \n"<<output_str << endl;

	system("pause");
	return 0;
}

运行结果如下:


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

C/C++中使用Base64编码解码(使用boost库) 的相关文章

随机推荐

  • linux查询mysql内存使用率_Linux查看CPU和内存使用情况方法总结

    在做Linux系统优化的时候 物理内存是其中最重要的一方面 自然的 Linux也提供了非常多的方法来监控宝贵的内存资源的使用情况 下面的清单详细的列出了Linux系统下通过视图工具或命令行来查看内存使用情况的各种方法 1 proc memi
  • 【ICCV2023】Robustifying Token Attention for Vision Transformers

    Robustifying Token Attention for Vision Transformers 论文 https arxiv org abs 2303 11126 代码 暂未开源 解读 ICCV 2023 Token过度聚焦暴露注
  • Topaz Video Enhance AI中文版

    教程 1 下载解压 双击运行 VideoEnhanceAI windows x64 installer exe 进入安装向导 2 勾选我接受许可协议 3 选择安装目录 也可以选择默认安装 4 安装完成 先不要运行软件 退出向导 5 将文件夹
  • android利用SAX解析xml(以解析谷歌天气预报xml预报为例)

    package com mars android import java io BufferedInputStream import java io InputStream import java net URL import java n
  • ElastAlert2告警不分词查询

    原查询条件 需求是带 服务商回传提单异常 的日志捞出来告警 当我按以下查询条件告警时会发现匹配不到我想要的日志 原因 query string查询默认就是模糊查询 并且是分词查询 例如 123 会拆分查询是否带否带1 带2 带3的日志 条件
  • Java 基本类型和包装类型侧重学习笔记(基础)

    包装类可以是null 而基本类型不可以
  • Ubuntu安装NVIDIA独立显卡驱动出现X service error问题解决方法

    目录 问题症状 解决方法 参考网址 问题症状 最近在Ubuntu下安装NVIDIA独立显卡驱动的过程中出现X service error问题 如下图所示 解决方法 0 到NVIDIA 官网上下载驱动文件 run 格式 Official Ge
  • python HHT实现方法

    引言 随着信号处理领域的不断发展 自适应信号处理和非线性信号分析成为了研究的热点 在这两个领域中 Hilbert Huang变换 HHT 作为一种强大的工具 被广泛应用于信号的时频分析和模态分解 本文将介绍如何使用Python实现HHT 并
  • 解决 微软应用商店无法联网 0x80072EFD问题

    近期使用微软应用商店发现不能正常的连接网络 小娜也是 经过检查是使用了代理自动配置脚本 PAC 的原因 按win键 输入网络代理设置 打开代理设置界面 设置 使用安装程序脚本 为关
  • SpringBean的生命周期

    Spring Bean Lifecycle 1 过程 1 调用无参构造 2 执行 set 方法设置属性 也可以是 Bean 注解方法内容 3 调用 BeanNameAware 的 setBeanName 方法 可以获得 Bean 的名字 4
  • 0N在计算机里面起什么作用,计算器0n/c是什么键

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 计算器0n c是开机键以及清屏键 此键一方面有着开机的功能 另一方面也有着清除屏幕内容的功能 计算器是现代人发明的可以进行数字运算的电子机器 现代的电子计算器能进行数学运算
  • 在微软任职近 20 年,Windows、Surface 负责人官宣将离职!

    整理 屠敏 出品 CSDN ID CSDNnews 9 月 19 日 据外媒 The Verge 报道 负责领导 Windows 开发和 Surface 产品线的微软首席产品官 CPO Panos Panay 即将离职 这一消息来得很突然
  • XML基本规则(XML语法规则)

    XML基本规则 XML语法规则 1 XML 文档必须包含在一个单一元素中 2 XML 元素不能重叠 必须正确的嵌套 3 不能省去任何结束标记 或者说标记必须成对 4 XML 元素是区分大小写的 也就是大小写敏感 5 XML 文档中的属性有两
  • 源码安装zabbix

    源码安装zabbix 1 zabbix简介 2 zabbix的主要功能 3 监控指标 4 zabbix配置文件 5 服务器端配置文件 6 客户端配置文件 7 部署zabbix 8 先安装apache 8 1 安装开发工具包 8 2 下载ap
  • python使用plt.savefig保存时图片保存不完整,四周留白太多

    问题 今天在给论文添加曲线图 使用matplotlib的savefig函数中遇到图片保存不完整 且留白太多的问题 插入到论文中很难看 左边是在pycharm里的截图 右边是通过savefig保存的图片 代码如下 保存图片 plt savef
  • 怎样在PB中实现文件的拷贝与删除 (转)

    怎样在PB中实现文件的拷贝与删除 转 more 怎样在PB中实现 文件的拷贝与删除 可借助外部 函数 可用 api函数实现 1 文件拷贝 函数声明 FUNCTION boolean CopyFileA ref string cfrom re
  • 安装及使用ceres遇到过的问题

    首先ceres安装及使用需要两个依赖库glog与gflags 这两个库安装时需要注意要么只用apt install要么只用源码编译安装 如果两个都装了用apt purge或者在 usr local lib及 usr local includ
  • 设置Unity的帧率

    问题描述 Xsens接收数据的频率是30Hz 为了接收到正确 完整的数据 要将Unity的帧率换成30帧 第一种方法 点击Editor gt Project Setting gt Quality 将VSync Count那选择Every S
  • 测试框架pytest教程(4)运行测试

    运行测试文件 pytest q test example py 会运行该文件内test 开头的测试方法 该 q quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中 但如果写在类中 类名需要是Test开头 非Test开
  • C/C++中使用Base64编码解码(使用boost库)

    Base64是一种用64个字符来表示任意二进制数据的方法 用记事本打开exe jpg pdf这些文件时 我们都会看到一大堆乱码 因为二进制文件包含很多无法显示和打印的字符 所以 如果要让记事本这样的文本处理软件能处理二进制数据 就需要一个二