参考链接:在C语言中使用libb64进行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编解码字符串或文件的更多相关文章

  1. C#字符串Base64编解码

    C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...

  2. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  3. Delphi Base64 编解码函数

    Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...

  4. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  5. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  6. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  7. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  8. 【VBA研究】如何用Base64 编解码方法实现简单的加解密

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...

  9. OpenSSL aes加解密实例+base64编解码

    OpenSSL aes加解密简单实例+base64编解码 #include <stdio.h> #include <string.h> #include <memory. ...

随机推荐

  1. AVPlayerViewController视频播放器

    前言 iOS8之后系统自带使用AVPlayerViewController播放视频 AVPlayerViewController AVPlayerViewController和导航控制器差不多,需要将 ...

  2. 【Luogu】P3052摩天大楼里的奶牛(状压DP)

    参见ZHT467的题解. f[i]表示在i这个集合下的最少分组数和当前组最少的容量. 从1到(1<<n)-1枚举i,对于每个i枚举它的子奶牛,然后重载运算符计算. 代码如下 #includ ...

  3. BZOJ2425 [HAOI2010]计数 【数位dp】

    题目 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...

  4. STL学习笔记(三) 关联容器

    条款19:理解相等(equality)和等价(equivalence)的区别 相等的概念是基于 operator== 的,如果 operator== 的实现不正确,会导致并不实际相等等价关系是以&qu ...

  5. Mongodb_分片集群模式

    前面介绍的副本集模式实现了数据库高可用. 但是还是存在的问题是: 所有的从节点都是从主节点全面拷贝,这样数据量过大时,从节点压力大.还有就是海量数据时存在硬件瓶颈, 毕竟每一个机器的存储量总是有限的. ...

  6. Centos7安装完成后一些基本操作

    1.基本操作一:主机名 # centos7有一个新的修改主机名的命令hostnamectl hostnamectl set-hostname --static www.node1.com # 有些命令 ...

  7. mysql delete语句不能用别名

    在mysql数据库里运行delete语句 delete ’; 发现会报错: [Err] - You have an error in your SQL syntax; check the manual ...

  8. 使用java连接AD域,验证账号密码是否正确

    eb项目中有时候客户要求我们使用ad域进行身份确认,不再另外做一套用户管理系统.其实客户就是只要一套账号可以访问所有的OA,CRM等办公系统.这就是第三方验证.一般有AD域,Ldap,Radius,邮 ...

  9. open-falcon的插件机制

    Plugin可以看做是对agent功能的扩充.对于业务系统的监控指标采集,最好不要做成plugin,而是把采集脚本放到业务程序发布包中,随着业务代码上线而上线,随着业务代码升级而升级,这样会比较容易管 ...

  10. 关于Lisp和函数式编程 & 各种语言对比 & TIOBE

    上一篇文章提到了,今天又读到Lisp的一些内容 <为什么Lisp如此先进>ruanyifeng(Link).关于Lisp的八卦,可以参考我前面两篇文章 http://www.cnblogs ...