参考链接:在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. 【CCF】交通规划 Dijstra变形 优先级队列重载

    [题意] 给定一个无向图,求这个图满足所有点到顶点的最短路径不变的最小生成树 [AC] 注意双向边要开2*maxm 注意优先级队列 参考https://www.cnblogs.com/cielosun ...

  2. Lucas定理详解

    这篇博客是从另一位园友那里存的,但是当时忘了写原文的地址,如果有找到原文地址的请评论联系! Lucas定理解决的问题是组合数取模.数学上来说,就是求 \(\binom n m\mod p\).(p为素 ...

  3. 易语言报错:无法定位链接器!请检查 tools\link.ini 中的配置是否正确。 静态连接失败

    今天下午搞易语言,在编写动态链接库以后,静态编译的时候出现以下提示: 无法定位链接器!请检查 tools\link.ini 中的配置是否正确. 静态连接失败 于是网上百度了下,找到相关的解决方法: 编 ...

  4. oracle怎么查看表空间里有哪些表

    select TABLE_NAME,TABLESPACE_NAME from dba_tables where TABLESPACE_NAME='表空间名'; 注意:表空间名要大写

  5. [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别

    [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别: applicationFrame会自动判断是否存在状态栏, ...

  6. JavaScript ES6中,export与export default

    自述: 本来是对new Vue()和export default比较懵的,查了一下,发现我理解错了两者的关系,也没意识到export与export default的区别,先简单的记录一下基本概念,后续 ...

  7. android 获得屏幕宽度和高度

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  8. printf行缓冲区的分析总结

    最近在客户那调试串口的时候,read串口然后printf打印,单字符printf,发现没有输出,后来想起来printf这些标准输入输出函数也是属于标准C库glibc的, 这里就要区分一下标准库函数和系 ...

  9. Java基础 笔记(四)

    泛型: 泛型:通过<数据额类型>来接受一种引用数据类型.作用在编译时.使用检查 加入集合的对象是否属于该类型,从而把执行时的问题转换为编译时异常.提高程序的安全性 避免抛出 ClassCa ...

  10. CS 和 BS 的区别和优缺点(转)

    转自:http://www.cnblogs.com/scnuyz/p/5808808.html bs是浏览器(browser)和服务器(server) cs是静态客户端程序(client)和服务器(s ...