base64dll

继上次的dll学习后,想开发个软件,连接到百度的云存储服务器,上传文件。发现要算秘钥,在网上找了到了hmac-sha1,base64的源码,发现有些是c++写的,有些是c写的一起写到一个文件里有些麻烦。今天上午就把base64写成dll,方便调用,也算是对昨天学习的一次复习。


base64dll的编写

base64dll.h:

extern "C" BASE64DLL_API std::string base64_encode(unsigned char * , unsigned int len);
extern "C" BASE64DLL_API std::string base64_decode(std::string & s);

base64dll.cpp:

/*
 * =====================================================================================
 *
 *       Filename:  base64dll.cpp
 *      Environment:    
 *    Description:  base64dll,导出导出函数为base64_decode 和 base64_encode
 *
 *
 *        Version:  1.0
 *        Created:  2013/10/29 11:04:34
 *         Author:  yuliyang
I*
 *             Mail:  wzyuliyang911@gmail.com
 *             Blog:  http://www.cnblogs.com/yuliyang
 *
 * =====================================================================================
 */

// base64dll.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "base64dll.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 == '/'));
}

// 这是导出变量的一个示例
BASE64DLL_API int nbase64dll=0;

// 这是导出函数的一个示例。
BASE64DLL_API int fnbase64dll(void)
{
    return 42;
}

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  base64_encode
 *  Description:  base64加密
 * =====================================================================================
 */
extern "C" BASE64DLL_API  std::string base64_encode(unsigned char * 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] = '';

        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;

}

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  base64_decode
 *  Description:  base64解密
 * =====================================================================================
 */
extern "C" BASE64DLL_API  std::string base64_decode(std::string & 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;

}

// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 base64dll.h
Cbase64dll::Cbase64dll()
{
    return;
}

导出函数如下:

49


base64dll.dll的使用

/*
 * =====================================================================================
 *
 *       Filename:  testbase64dll.cpp
 *      Environment:    
 *    Description:  base64dll.dll的使用测试文件
 *
 *
 *        Version:  1.0
 *        Created:  2013/10/29 11:08:46
 *         Author:  yuliyang
I*
 *             Mail:  wzyuliyang911@gmail.com
 *             Blog:  http://www.cnblogs.com/yuliyang
 *
 * =====================================================================================
 */

// testbase64dll.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE hinst;
    hinst=LoadLibrary("base64dll.dll");
    typedef std::string (*ADDPROC)(unsigned char *,unsigned int);
    ADDPROC base64_encode=(ADDPROC)GetProcAddress(hinst,"base64_encode"); /* 获取base64_encode函数地址 */
    typedef std::string (*ADDPROC2)(std::string & s);
    ADDPROC2 base64_decode=(ADDPROC2)GetProcAddress(hinst,"base64_decode"); /* 获取base64_decode函数地址 */
    
    /*-----------------------------------------------------------------------------
     *  测试字符串一
     *
     *-----------------------------------------------------------------------------*/
    
    std::string s = "ADP GmbH" ;
    


    std::string encoded = base64_encode((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;

    /*-----------------------------------------------------------------------------
     *  测试字符串二
     *
     *-----------------------------------------------------------------------------*/
    s="sjhdhahdsa";

    std::string encoded2 = base64_encode((unsigned char*)s.c_str(), s.length());
    std::string decoded2 = base64_decode(encoded2);

    std::cout << "encoded:
" << encoded2 << std::endl;
    std::cout << "decoded:
" << decoded2 << std::endl;
    
    
    
    return 0;
}

结果图:

50

下次继续把hmac-sha1,urlencode封装成DLL文件

提供自己的base64dll 一份

 http://pan.baidu.com/s/1AC2ZO

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/yuliyang/p/3393982.html