#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);

};

#include "stdAfx.h"

#include "ZBase64.h"



string ZBase64::Encode(const unsigned char* Data,int DataByte)

{

    //编码表

    const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    //返回值

    string strEncode;

    unsigned ]={};

    ;

    ;i<();i++)

    {

        Tmp[] = *Data++;

        Tmp[] = *Data++;

        Tmp[] = *Data++;

        strEncode+= EncodeTable[Tmp[] >> ];

        strEncode+= EncodeTable[((Tmp[] << ) | (Tmp[] >> )) & 0x3F];

        strEncode+= EncodeTable[((Tmp[] << ) | (Tmp[] >> )) & 0x3F];

        strEncode+= EncodeTable[Tmp[] & 0x3F];

        ,LineLength==) {strEncode+=;}

    }

    //对剩余数据进行编码

    ;

    )

    {

        Tmp[] = *Data++;

        strEncode+= EncodeTable[(Tmp[] & ];

        strEncode+= EncodeTable[((Tmp[] & )];

        strEncode+= "==";

    }

    )

    {

        Tmp[] = *Data++;

        Tmp[] = *Data++;

        strEncode+= EncodeTable[(Tmp[] & ];

        strEncode+= EncodeTable[((Tmp[] & ) | ((Tmp[] & )];

        strEncode+= EncodeTable[((Tmp[] & )];

        strEncode+= "=";

    }

    

    return strEncode;

}



string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)

{

    //解码表

    const char DecodeTable[] =

    {

        , , , , , , , , , , , , , , , , , , , , , , , ,

        , , , , , , , , , , , , , , , , , , ,

        , // '+'

        , , ,

        , // '/'

        , , , , , , , , , , // '0'-'9'

        , , , , , , ,

        , , , , , , , , , , , , ,

        , , , , , , , , , , , , , // 'A'-'Z'

        , , , , , ,

        , , , , , , , , , , , , ,

        , , , , , , , , , , , , , // 'a'-'z'

    };

    //返回值

    string strDecode;

    int nValue;

    ;

    while (i < DataByte)

    {

        if (*Data != '\r' && *Data!='\n')

        {

            nValue = DecodeTable[*Data++] << ;

            nValue += DecodeTable[*Data++] << ;

            strDecode+=(nValue & ;

            OutByte++;

            if (*Data != '=')

            {

                nValue += DecodeTable[*Data++] << ;

                strDecode+=(nValue & ;

                OutByte++;

                if (*Data != '=')

                {

                    nValue += DecodeTable[*Data++];

                    strDecode+=nValue & 0x000000FF;

                    OutByte++;

                }

            }

            i += ;

        }

        else// 回车换行,跳过

        {

            Data++;

            i++;

        }

     }

    return strDecode;

}

使用示例(结合CxImage库):

CString CScanDlg::EncodeImage()

{//对图片进行Base64编码

    ZBase64 zBase;

    //图片编码

    CxImage  image;   // 定义一个CxImage对象    

    image.Load(this->m_strImgPath, CXIMAGE_FORMAT_JPG);   //先装载jpg文件,需要指定文件类型

    ;//得到图像大小

    BYTE* buffer=;//存储图像数据的缓冲

    image.Encode(buffer,size,CXIMAGE_FORMAT_JPG);//把image对象中的图像以type类型数据copy到buffer

    string strTmpResult=zBase.Encode(buffer,size);

    CString result;

    result = strTmpResult.c_str();

    return result;

}

void CScanDlg::DecodeImageData(CString strData)

{//对Base64编码过的数据解码并显示原图片



    ZBase64 zBase;

    ;

    string strTmpResult=zBase.Decode(strData,strData.GetLength(),OutByte);

    int i,len = strTmpResult.length();

    BYTE *buffer = new BYTE[len];

    ;i<len;++i)

    {

        buffer[i] = strTmpResult[i];

    }

    CxImage image(buffer,len,CXIMAGE_FORMAT_JPG);//把内存缓冲buffer中的数据构造成Image对象

    delete [] buffer;

    CDC* hdc = m_picture.GetDC();

    m_bitmap = image.MakeBitmap(hdc->m_hDC);

    HBITMAP h0ldBmp = m_picture.SetBitmap(m_bitmap);

    if(h0ldBmp) DeleteObject(h0ldBmp);

    if(hdc->m_hDC) m_picture.ReleaseDC(hdc);

    if(m_bitmap) DeleteObject(m_bitmap);

}

作者:洞庭散人

出处:http://phinecos.cnblogs.com/    

本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。

Base64编解码(C++版)的更多相关文章

  1. python3的base64编解码

    使用python3的base64编解码实现字符串的简易加密解密 引言: 在一些项目中,接口的报文是通过base64加密传输的,所以在进行接口自动化时,需要对所传的参数进行base64编码,对拿到的响应 ...

  2. Delphi Base64 编解码函数

    Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...

  3. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  4. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  5. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  6. openssl命令行Base64编解码

    openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...

  7. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  8. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  9. EasyDarwin开源流媒体云平台中boost Base64编解码后与源长度不匹配的bug

    本文转自EasyDarwin团队Alex的博客:http://blog.csdn.net/cai6811376 EasyDarwin云平台中部分协议使用了Base64编码昨晚报文通信的载体.比如在对摄 ...

随机推荐

  1. C#基础(四)

                                                          语句          到目前为止,我们的程序还只能按照编写的顺序执行,中途不能发生任何变化 ...

  2. $.toJSON的用法或把数组转换成json类型

    1. html页面全部代码 <html> <head>     <title></title> <script src="../../S ...

  3. [HDOJ4022]Bombing(离散化+stl)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4022 一个图上有n个点,之后m个操作,每次操作一行或者一列.使得这一行或者这一列的点全部消除.每次操作 ...

  4. 函数lock_rec_bitmap_reset

    /*********************************************************************//** Resets the record lock bi ...

  5. css配合js模拟的select下拉框

    css配合js模拟的select下拉框 <!doctype html> <html> <head> <meta charset="utf-8&quo ...

  6. UVa 10596 Moring Walk【欧拉回路】

    题意:给出n个点,m条路,问能否走完m条路. 自己做的时候= =三下两下用并查集做了交,WA了一发-后来又WA了好几发--(而且也是判断了连通性的啊) 搜了题解= = 发现是这样的: 因为只要求走完所 ...

  7. SVN备份及其还原 — dump/load方法

    本文中采用最简单的dump/load方法.备份:一个较大的Subsersion版本库想用最少的空间来将它备份下来,用这个命令(请将/repo替换成你的版本库路径)svnadmin dump --del ...

  8. SQL Server索引怎么用

    什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的速度,汉语字(词)典一般都有按拼音. ...

  9. Java [leetcode 8] String to Integer (atoi)

    问题描述: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ...

  10. 服务器安装Apache+Tomcat+Memcached共享Session的构架设计

    网站集群部署解决计划 一.       计划目标 实现互动留言系统.后台发布系统的高可用性,有效解决高并发量对单台应用服务器的打击,确保应用服务器单点故障不影响系统正常运行. 二.       部署架 ...