欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

C++实现图片的base64编码

发布时间:2025/7/25 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C++实现图片的base64编码 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

from:http://blog.csdn.net/hei_ya/article/details/51637929

1.base64编码的原因

网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法。

2.base64编码原理

 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。


ZBase64.h

[cpp] view plaincopy
  • <span style="font-size:18px;">#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);  
  • };</span>  

  • ZBase64.cpp [cpp] view plaincopy
  • #include "ZBase64.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;  
  • }  

  • 3.使用示例(结合OpenCV)

    main.cpp

    [cpp] view plaincopy
  • <span style="font-size:18px;">#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;  
  • }</span>  
  •                        

        


    参考文献

    【1】http://www.cnblogs.com/chengxiaohui/articles/3951129.html

    【2】http://www.ithao123.cn/content-18

    【3】http://www.cppblog.com/wanghaiguang/archive/2013/03/20/198626.aspx

    总结

    以上是生活随笔为你收集整理的C++实现图片的base64编码的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。