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. ...
随机推荐
- 写给新员工的十点SQL开发建议
1.建立自己的知识体系 摘抄一句话你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来: 做笔记: 把笔记放在可以随时被找到的地方.个人的笔记可以放在印象笔记之类工具上,单位上的笔 ...
- Codeforces 895.A Pizza Separation
A. Pizza Separation time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 常州模拟赛d2t2 小X的密室
题目描述 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 单向地 创造一条从房间 X 到房间 Y 的通道.另 ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- 用 Jackson 来处理 JSON
Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好. 首先创建一个User对象类 (User.java) package com.sivalabs.json; impor ...
- Nearest Common Ancestors(poj 1330)
题意:给定一棵树,询问两个节点的最近公共祖先. 输入:第一行T,表示测试组数. 每组测试数据包含一个n,表示节点数目,下面n-1行是连接的边,最后一行是询问 输出:共T行,代表每组的测试结果 /* 倍 ...
- TYVJ3680 找妹子
时间: 1000ms / 空间: 1200KiB / Java类名: Main 背景 本题由 @fjzzq2002 提供,已奖励20金币. 描述 sps是zzq的好伙伴. sps一天叫来了许多个妹子. ...
- hdu 1224 最长路
开始用dijkstra直接求,发现不行,算法问题(1-2,(30),2-4(20),1--3(10),3--4(100)最后一个点无法更新,导致错误),后用取负,加大数法也没过. 现在(寒假了):求负 ...
- Elasticsearch使用syslog发送Watcher告警事件
https://blog.csdn.net/mvpboss1004/article/details/70158864?locationNum=9&fps=1
- AC日记——[USACO08DEC]干草出售Hay For Sale 洛谷 P2925
题目描述 Farmer John suffered a terrible loss when giant Australian cockroaches ate the entirety of his ...