#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. Eliza Doolittle lyrics Big City

    Eliza Doolittle lyrics  Big City 歌词很好,现在还没有,以后添加进来.

  2. SPOJ 1435 Vertex Cover 树形DP

    i 表示节点 i ,j=0表示不选择其父节点,j=1表示选择其父节点.f 为其父节点. 取 每个节点选择/不选择 两者中较小的那个. 一组数据: 151 21 31 41 1010 910 1112 ...

  3. MySQL 5.7 SYS scheme解析

    sys 库是MySQL 5.7其中的一个系统库,里面有很多很好用的跟性能相关的视图.函数和存储过程, 增强MySQL的易用性 例如:哪些语句使用了临时表,哪个用户请求了最多的io,哪个线程占用了最多的 ...

  4. BZOJ 2440 完全平方数(莫比乌斯-容斥原理)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2440 题意:给定K.求不是完全平方数(这里1不算完全平方数)的倍数的数字组成的数字集合S ...

  5. python学习笔记之初识Python

    一直听说python语音的简单易用而又强大,今天终于忍不住借本书,开始接触接触一下它,下面结合书本和自己的一些体会,写一下刚刚接触python的东西,重点写一些和C++有区别的地方. (1)输入inp ...

  6. mac下git中文乱码

    今天从window切mac,git使用时各种问题.典型的就是,git commit 可以使用中文注释,但是使用 git log 查看的时候发现都是乱码,乱码效果如下: <B1><E0 ...

  7. C# 实现对接电信交费易自动缴费

    他有这样一个JS PassGuardCtrl.js 部分代码    1 defaults:{  2             obj:null,  3             random:null,/ ...

  8. UVa 12063 (DP) Zeros and Ones

    题意: 找出长度为n.0和1个数相等.没有前导0且为k的倍数的二进制数的个数. 分析: 这道题要用动态规划来做. 设dp(zeros, ones, mod)为有zeros个0,ones个1,除以k的余 ...

  9. 无法连接到SQL Server 2008 R2

    服务器环境: 操作系统    名称:    Microsoft Windows Server 2008 R2 Enterprise     版本:    6.1.7601    服务包:    Ser ...

  10. BZOJ2229: [Zjoi2011]最小割

    题解: 真是一道神题!!! 大家还是围观JZP的题解吧(网址找不到了...) 代码: #include<cstdio> #include<cstdlib> #include&l ...