C++,Base64编解码字符串或文件
GitHub地址:https://github.com/BuYishi/cpp_base64_demo
base64_demo.cpp
#include <iostream>
#include <fstream>
#include "Base64Encoder.h"
#include "Base64Decoder.h"
using namespace std;
void encodeDemo();
void decodeDemo();
int main()
{
encodeDemo();
decodeDemo();
system("pause");
return ;
}
void encodeDemo()
{
const char *text = "John Rambo";
Base64Encoder encoder;
const string &encodedText = encoder.encode(text);
cout << encodedText << endl;
string inputFilename("E:/Packages/Java/jdk-8u144-windows-x64.exe");
ifstream ifs(inputFilename, ifstream::binary);
if (ifs)
{
string encodedFilename(inputFilename + ".txt");
ofstream ofs(encodedFilename, ofstream::binary);
if (ofs)
{
streamsize numberOfBytesRead;
int numberOfBytesEncoded;
constexpr int inputBufferSize = * ;
char inputBuffer[inputBufferSize];
char encodedBuffer[inputBufferSize * ];
while (!ifs.eof())
{
numberOfBytesRead = ifs.read(inputBuffer, inputBufferSize).gcount();
numberOfBytesEncoded = encoder.encode(inputBuffer, numberOfBytesRead, encodedBuffer);
ofs.write(encodedBuffer, numberOfBytesEncoded);
}
numberOfBytesEncoded = encoder.encodeEnd(encodedBuffer);
ofs.write(encodedBuffer, numberOfBytesEncoded);
}
else
cout << "Cannot open file: " << encodedFilename << endl;;
}
else
cout << "Cannot open file: " << inputFilename << endl;
}
void decodeDemo()
{
Base64Decoder decoder;
const string &decodedText = decoder.decode("QWxsIGlzIHdlbGwh");
cout << decodedText << endl;
string filename("E:/Packages/Android/docs-24_r01.zip.txt");
ifstream ifs(filename, ifstream::binary);
if (ifs)
{
filename = "android_docoment";
ofstream ofs(filename, ofstream::out | ofstream::binary);
if (ofs)
{
streamsize numberOfBytesRead;
int numberOfBytesDecoded;
constexpr int bufferSize = * ;
char inputBuffer[bufferSize];
char decodedBuffer[bufferSize];
while (!ifs.eof())
{
numberOfBytesRead = ifs.read(inputBuffer, ).gcount();
numberOfBytesDecoded = decoder.decode(inputBuffer, numberOfBytesRead, decodedBuffer);
ofs.write(decodedBuffer, numberOfBytesDecoded);
}
}
else
cout << "Cannot open file: " << filename << endl;
}
else
cout << "Cannot open file: " << filename << endl;
}
Base64Encoder.h
#ifndef BASE64_ENCODER_H
#define BASE64_ENCODER_H
#include <string>
extern "C"
{
#include <libb64/cencode.h>
}
class Base64Encoder
{
public:
Base64Encoder();
std::string encode(const std::string &text);
int encode(const char *inputBuffer, unsigned count, char *encodedBuffer);
int encodeEnd(char *encodedBuffer);
private:
base64_encodestate state;
};
#endif
Base64Encoder.cpp
#include "Base64Encoder.h"
Base64Encoder::Base64Encoder() { base64_init_encodestate(&state); }
std::string Base64Encoder::encode(const std::string &text)
{
char *buffer = new char[text.length() * ];
int numberOfBytesEncoded = base64_encode_block(text.c_str(), text.length(), buffer, &state);
numberOfBytesEncoded += base64_encode_blockend(buffer + numberOfBytesEncoded, &state);
buffer[numberOfBytesEncoded] = '\0';
std::string result(buffer);
delete[] buffer;
base64_init_encodestate(&state);
return result;
}
int Base64Encoder::encode(const char *inputBuffer, unsigned count, char *encodedBuffer)
{
return base64_encode_block(inputBuffer, count, encodedBuffer, &state);
}
int Base64Encoder::encodeEnd(char *encodedBuffer)
{
return base64_encode_blockend(encodedBuffer, &state);
}
Base64Decoder.h
#ifndef BASE64_DECODER_H
#define BASE64_DECODER_H
#include <string>
extern "C"
{
#include <libb64/cdecode.h>
}
class Base64Decoder
{
public:
Base64Decoder();
std::string decode(const std::string &code);
int decode(const char *inputBuffer, int count, char *decodedBuffer);
private:
base64_decodestate state;
};
#endif
Base64Decoder.cpp
#include "Base64Decoder.h"
Base64Decoder::Base64Decoder() { base64_init_decodestate(&state); }
std::string Base64Decoder::decode(const std::string &code)
{
char *buffer = new char[code.length()];
int numberOfCharacters = base64_decode_block(code.c_str(), code.length(), buffer, &state);
buffer[numberOfCharacters] = '\0';
std::string result(buffer);
delete[] buffer;
return result;
}
int Base64Decoder::decode(const char *inputBuffer, int count, char *decodedBuffer)
{
return base64_decode_block(inputBuffer, count, decodedBuffer, &state);
}
C++,Base64编解码字符串或文件的更多相关文章
- C#字符串Base64编解码
C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...
- ios Base64编解码工具类及使用
为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...
- Delphi Base64 编解码函数
Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...
- Java实现BASE64编解码
Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...
- Delphi 自带的 Base64 编解码函数
今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...
- python rsa 加密解密 (编解码,base64编解码)
最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...
- python base64 编解码,转换成Opencv,PIL.Image图片格式
二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...
- 【VBA研究】如何用Base64 编解码方法实现简单的加解密
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...
- OpenSSL aes加解密实例+base64编解码
OpenSSL aes加解密简单实例+base64编解码 #include <stdio.h> #include <string.h> #include <memory. ...
随机推荐
- AVPlayerViewController视频播放器
前言 iOS8之后系统自带使用AVPlayerViewController播放视频 AVPlayerViewController AVPlayerViewController和导航控制器差不多,需要将 ...
- 【Luogu】P3052摩天大楼里的奶牛(状压DP)
参见ZHT467的题解. f[i]表示在i这个集合下的最少分组数和当前组最少的容量. 从1到(1<<n)-1枚举i,对于每个i枚举它的子奶牛,然后重载运算符计算. 代码如下 #includ ...
- BZOJ2425 [HAOI2010]计数 【数位dp】
题目 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...
- STL学习笔记(三) 关联容器
条款19:理解相等(equality)和等价(equivalence)的区别 相等的概念是基于 operator== 的,如果 operator== 的实现不正确,会导致并不实际相等等价关系是以&qu ...
- Mongodb_分片集群模式
前面介绍的副本集模式实现了数据库高可用. 但是还是存在的问题是: 所有的从节点都是从主节点全面拷贝,这样数据量过大时,从节点压力大.还有就是海量数据时存在硬件瓶颈, 毕竟每一个机器的存储量总是有限的. ...
- Centos7安装完成后一些基本操作
1.基本操作一:主机名 # centos7有一个新的修改主机名的命令hostnamectl hostnamectl set-hostname --static www.node1.com # 有些命令 ...
- mysql delete语句不能用别名
在mysql数据库里运行delete语句 delete ’; 发现会报错: [Err] - You have an error in your SQL syntax; check the manual ...
- 使用java连接AD域,验证账号密码是否正确
eb项目中有时候客户要求我们使用ad域进行身份确认,不再另外做一套用户管理系统.其实客户就是只要一套账号可以访问所有的OA,CRM等办公系统.这就是第三方验证.一般有AD域,Ldap,Radius,邮 ...
- open-falcon的插件机制
Plugin可以看做是对agent功能的扩充.对于业务系统的监控指标采集,最好不要做成plugin,而是把采集脚本放到业务程序发布包中,随着业务代码上线而上线,随着业务代码升级而升级,这样会比较容易管 ...
- 关于Lisp和函数式编程 & 各种语言对比 & TIOBE
上一篇文章提到了,今天又读到Lisp的一些内容 <为什么Lisp如此先进>ruanyifeng(Link).关于Lisp的八卦,可以参考我前面两篇文章 http://www.cnblogs ...