全栈工程师开发手册 (作者:栾鹏)
架构系列文章

字符数组的base64编解码

base64.h

#include <string>std::string base64_encode(unsigned char const* , unsigned int len);
std::string base64_decode(std::string const& s);

base64.cpp

#include "base64.h"
#include <iostream>static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz""0123456789+/";static inline bool is_base64(unsigned char c) {return (isalnum(c) || (c == '+') || (c == '/'));
}std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {std::string ret;int i = 0;int j = 0;unsigned char char_array_3[3];unsigned char char_array_4[4];while (in_len--) {char_array_3[i++] = *(bytes_to_encode++);if (i == 3) {char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);char_array_4[3] = char_array_3[2] & 0x3f;for(i = 0; (i <4) ; i++)ret += base64_chars[char_array_4[i]];i = 0;}}if (i){for(j = i; j < 3; j++)char_array_3[j] = '\0';char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);char_array_4[3] = char_array_3[2] & 0x3f;for (j = 0; (j < i + 1); j++)ret += base64_chars[char_array_4[j]];while((i++ < 3))ret += '=';}return ret;}std::string base64_decode(std::string const& encoded_string) {int in_len = encoded_string.size();int i = 0;int j = 0;int in_ = 0;unsigned char char_array_4[4], char_array_3[3];std::string ret;while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {char_array_4[i++] = encoded_string[in_]; in_++;if (i ==4) {for (i = 0; i <4; i++)char_array_4[i] = base64_chars.find(char_array_4[i]);char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];for (i = 0; (i < 3); i++)ret += char_array_3[i];i = 0;}}if (i) {for (j = i; j <4; j++)char_array_4[j] = 0;for (j = 0; j <4; j++)char_array_4[j] = base64_chars.find(char_array_4[j]);char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];for (j = 0; (j < i - 1); j++) ret += char_array_3[j];}return ret;
}

测试文件 base64_test.cpp

#include "base64.h"
#include <iostream>  int main() {  const std::string s = "hello world\n11111111111 & 333333333\n444 dasssss" ;  std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(s.c_str()), s.length());  std::string decoded = base64_decode(encoded);  std::cout << "encoded: " << encoded << std::endl;  std::cout << "decoded: " << decoded << std::endl;  return 0;
}

运行测试:

当前目录下执行

g++ -c base64.cpp       编译成.o格式
g++ -c base64_test.cpp    编译成.o格式
ar -rc base64.a base64.o        打包成静态库文件
g++ -o test base64_test.o base64.a    链接成可执行文件
./test      运行可执行文件

图片的base64位编解码

base64.h

#include <string>
using namespace std;class ZBase64
{
public:/*编码DataByte[in]输入的数据长度,以字节为单位*/string Encode(const unsigned char* Data,int DataByte);/*解码DataByte[in]输入的数据长度,以字节为单位OutByte[out]输出的数据长度,以字节为单位,请不要通过返回值计算输出数据的长度*/string Decode(const char* Data,int DataByte,int& OutByte);
};

base64.cpp

#include "base64.h"string ZBase64::Encode(const unsigned char* Data,int DataByte)
{//编码表const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//返回值string strEncode;unsigned char Tmp[4]={0};int LineLength=0;for(int i=0;i<(int)(DataByte / 3);i++){Tmp[1] = *Data++;Tmp[2] = *Data++;Tmp[3] = *Data++;strEncode+= EncodeTable[Tmp[1] >> 2];strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];strEncode+= EncodeTable[Tmp[3] & 0x3F];if(LineLength+=4,LineLength==76) {strEncode+="\r\n";LineLength=0;}}//对剩余数据进行编码int Mod=DataByte % 3;if(Mod==1){Tmp[1] = *Data++;strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];strEncode+= "==";}else if(Mod==2){Tmp[1] = *Data++;Tmp[2] = *Data++;strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];strEncode+= "=";}return strEncode;
}string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)
{//解码表const char DecodeTable[] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,62, // '+'0, 0, 0,63, // '/'52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'0, 0, 0, 0, 0, 0, 0,0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'0, 0, 0, 0, 0, 0,26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'};//返回值string strDecode;int nValue;int i= 0;while (i < DataByte){if (*Data != '\r' && *Data!='\n'){nValue = DecodeTable[*Data++] << 18;nValue += DecodeTable[*Data++] << 12;strDecode+=(nValue & 0x00FF0000) >> 16;OutByte++;if (*Data != '='){nValue += DecodeTable[*Data++] << 6;strDecode+=(nValue & 0x0000FF00) >> 8;OutByte++;if (*Data != '='){nValue += DecodeTable[*Data++];strDecode+=nValue & 0x000000FF;OutByte++;}}i += 4;}else// 回车换行,跳过{Data++;i++;}}return strDecode;
}

测试 base64_test.cpp

用到了opencv来读取图片, ubuntu下的opencv安装教程可参考:https://blog.csdn.net/luanpeng825485697/article/details/81181825

#include<opencv2/opencv.hpp>
#include<iostream>
#include"ZBase64.h"
#include<vector>using namespace std;
using namespace cv;void main()
{Mat img = imread("1.bmp");vector<uchar> vecImg;                               //Mat 图片数据转换为vector<uchar>vector<int> vecCompression_params;vecCompression_params.push_back(CV_IMWRITE_JPEG_QUALITY);vecCompression_params.push_back(90);imencode(".jpg", img, vecImg, vecCompression_params);ZBase64 base64;string imgbase64 = base64.Encode(vecImg.data(), vecImg.size());     //实现图片的base64编码cout << imgbase64 << endl;
}

运行测试:

当前目录下执行

g++ -c base64.cpp       编译成.o格式
g++ -c base64_test.cpp    编译成.o格式
ar -rc base64.a base64.o        打包成静态库文件
g++ -o test base64_test.o base64.a    链接成可执行文件
./test      运行可执行文件

ubuntu下c++中base64编解码测试和图片编解码测试相关推荐

  1. ubuntu下KDvelop中怎么显示行号

    ubuntu下KDvelop中怎么显示行号: 亲测好使:为节省时间只做资源的搬运工 https://blog.csdn.net/weixin_42927959/article/category/792 ...

  2. Ubuntu下几个命令行方式使用的图片浏览工具

    想找几个Ubuntu下可以以命令行方式使用的图片浏览工具. Google了一些资料,找到下面几个web: 1.pho:轻巧的命令行图片查看器 其中介绍了工具pho,其功能特点,见下面的转帖内容: ph ...

  3. ubuntu下firefox中,直接在网页上安装程序的方法

    我不知道别人是怎么做的,反正这个问题恶心死了. ubuntu下安装软件,一般都是gogole到一个页面,然后上面告诉你把下面的代码输入到ternimal. sudo apt-add-repositor ...

  4. [Linux]Ubuntu下chrome中五笔输入法不能通过shift切换中英文

    **背景:**鉴于自己前后鼻音和平翘舌不分的缘故,我也是恨下心来使用五笔输入法,在使用的过程中还是有很多问题.其中一个就是在chrome中,五笔输入法不能通过shift(包括其他中英文切换按键)中英文 ...

  5. Ubuntu下Qt中使用pcl库

    pcl依赖及安装 1.一般不用到qt或vtk显示点云 ###pcl通过ppa安装步骤 //这样安装,目前默认安装的是pcl1.7.2 sudo add-apt-repository ppa:v-lau ...

  6. ubuntu下sublime中修改字体

    环境: Ubuntu Linux 16.04 sublime 3 选择 Preferences=>Settings=>修改Preferences.sublime-settings--Use ...

  7. ubuntu 下浏览器中打开网页乱码解决

    出现的问题:在ubutnu下,自己写的网页代码(里面有中文),在文本编辑器中还显示正常,但在chrome和firefox中却出现乱码. 原因:ubutnu默认的编码方式为utf-8,而chrome浏览 ...

  8. 解决ubuntu下crossover中qq中文字体乱码问题

    本文适应于ubuntu16.04,crossover16.2.0-1.(如使用qq推荐使用腾讯qq8.9-2,点击下方的安装windows软件,在输入框输入"qq"两字即可看到) ...

  9. linux crossover 乱码,解决ubuntu下crossover中qq中文字体乱码问题

    本文适应于ubuntu16.04,crossover16.2.0-1.(如使用qq推荐使用腾讯qq8.9-2,点击下方的安装windows软件,在输入框输入"qq"两字即可看到) ...

最新文章

  1. 1061 Dating
  2. 先搞懂这八大基础概念,再谈机器学习入门!
  3. Flask框架从入门到精通之转换器(四)
  4. linux下的软件包安装(rpm   yum)
  5. linux 压缩解压归档
  6. 产品经理懂技术=流氓会武术(zz)
  7. python中文字体怎么设置_python matplotlib 中文字体设置
  8. c语言递归算法实验报告,递归算法实验报告.docx
  9. 组策略里更改更新和设置客户端首页
  10. 88.合并两个有序数组(力扣leetcode)博主可答疑该问题
  11. 电脑只能上微信不能打开网页_电脑可以上微信,但是网页打不开怎么解决
  12. 【编译原理】理解BNF
  13. 2022QS世界大学学科排名出炉,计算机学科有哪些信息值得关注?
  14. Qt添加工具栏按钮————附详细步骤
  15. python算法 之 猜词游戏
  16. 刷机:酷比魔方iwork8 刷回双系统
  17. 联泰科技与赢创联合研发实验室正式成立;丰田携手Fleetsu提供互联车队管理解决方案 | 全球TMT...
  18. MATLAB——Harris角点检测
  19. 人人网模拟用户登陆行为后进入包贝尔的个人主页
  20. 苹果切换系统按哪个键_苹果全新笔记本 一体机正品专区

热门文章

  1. 【原创】3大主流的移动应用方式APP开发姿势解读
  2. 二级 办公软件高级应用技术_塔河县(局)工会举办电脑办公应用技术培训班...
  3. PUT与POST的相同点和不同点
  4. golang mysql 工具类_golang操作mysql使用总结
  5. YUV通过MediaCodec编码H264
  6. SDL2源代码分析2:窗口(SDL_Window)
  7. 功能安全 李艳文_李艳文:智能网联全新安全问题凸显 相关自动驾驶事故逐年增加...
  8. SpringBoot项目热部署配置
  9. Maven引用本地jar并在打war包时引用jar
  10. Windows下VSCode运行shell