当前位置: 首页 > news >正文

MFC - 使用 Base64 对图片进行加密解密

1 ++Base64.h

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

2 //++Base64.cpp

//++Base64.cpp
#include "stdafx.h"
#include "++Base64.h"CBase64::CBase64()
{}CBase64::~CBase64()
{}std::string CBase64::Encode(const 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;
}std::string CBase64::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;
}

3 Base64DemoDlg.cpp 中加入调用代码,Base64DemoDlg.h 中引入 ++Base64.h 头文件。

//以下是读写图片的调用代码:
bool ReadPhotoFile(std::basic_string<TCHAR> strFileName, std::string &strData)
{HANDLE hFile;hFile = CreateFile(strFileName.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){return false;}DWORD dFileSize = GetFileSize(hFile, NULL);char * pBuffer = new char[dFileSize + 1];if (pBuffer == NULL)return false;memset(pBuffer, 0, dFileSize);DWORD dReadSize(0);if (!ReadFile(hFile, pBuffer, dFileSize, &dReadSize, NULL)){delete[]pBuffer;CloseHandle(hFile);return false;}CBase64 base64;strData = "";strData = base64.Encode((const char*)pBuffer, dReadSize);delete[]pBuffer;CloseHandle(hFile);return true;
}bool WritePhotoFile(std::basic_string<TCHAR> strFileName, std::string &strData)
{HANDLE hFile;hFile = CreateFile(strFileName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){return false;}CBase64 base64;int datalen(0);DWORD dwritelen(0);std::string strdcode = base64.Decode(strData.data(), strData.size(), datalen);if (!WriteFile(hFile, strdcode.data(), datalen, &dwritelen, NULL)){CloseHandle(hFile);return false;}CloseHandle(hFile);return true;
}

4 测试,获取图片路径,读取图片加密得到 imageData,然后将 imageData 解密写入新文件。

//测试
void CBase64DemoDlg::OnBnClickedButtonTest()
{//1 获取文本框文件路径CString strFilePath;GetDlgItemText(IDC_EDIT_FILEPATH, strFilePath);//2 图片文件进行 Base64编码,存储到 imageDatastring imageData;ReadPhotoFile(strFilePath.GetString(), imageData);//3 将 imageData 解码后,生成 新图片CString strNewFilePath;strNewFilePath = _T("D:\\文件\\456.jpg");WritePhotoFile(strNewFilePath.GetString(), imageData);//其他/*CString 转 std::wstringstd::wstring str = filename.GetString();std::wstring 转 CStringCString str( filename.c_str() );*/
}

5 效果

参考:

C++读写图片数据转成Base64格式的一种方法
https://www.cnblogs.com/jeray/p/8746976.html

C++读写图片数据转成Base64格式
https://www.cnblogs.com/chechen/p/10417424.html

CString和wstring互转
https://blog.csdn.net/tg2003/article/details/4333130

http://www.dtcms.com/a/569150.html

相关文章:

  • Git+SSH 实现控制分支的提交权限
  • 网站建设选择题网站的内容建设
  • 怎么用自己电脑做网站服务器刚做淘客没有网站
  • CUDA C++编程指南(3.1)——使用NVCC编译
  • Numpy学习总结
  • 可梦AI获首批企业好评,蜜糖网络入驻共启AI短剧工业化
  • 笔记跨设备无缝切换?Joplin+cpolar让多设备同步更自由
  • Swift 6.2 列传(第四篇):enumerated () 的 “集合神功”
  • PDF 全文翻译开发实现思路:挑战、细节与工程化解决方案
  • 算法解析:从杨辉三角到几何查询的编程实践
  • 数学基础---刚体变换(旋转矩阵与平移矩阵)
  • 找别人建网站去哪里设计网址合集
  • 宁波网站建设费用wordpress启用注册
  • 我的第一个开源项目IOT-Tree Server-实际项目使用介绍
  • 蓝牙钥匙 第41次 紧急情况处理场景下的汽车数字钥匙系统:全方位应急方案设计与实现
  • Nestjs框架: gRPC微服务通信及安全实践全解析
  • 朴朴超市小程序分析
  • 济南物流公司网站建设金华建设工程网站
  • visual basic 从入门到精通 IT9网络学院VB编程系列培训教程
  • 厦门汽车充电站建设报备网站免费ppt模板下载中国风
  • 操作系统期中考试
  • 陕西建设集团韩城公司网站怎样创建基本的网站
  • 每日两题day33
  • 【解决】Failed to remove partition 1 from system: 设备或资源忙
  • Android通过SQL查询trace分析进程启动线程总数量
  • 超轻量级 AI 网安工具
  • 【C++】封装红黑树实现map和set容器(详解)
  • sscanf解析
  • 中专生实习找什么工作?
  • 车辆车身颜色特征识别