zoukankan      html  css  js  c++  java
  • 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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    如何创建支持64位的安装程序
    SharePoint Server 2013开发之旅(四):配置工作流开发和测试环境
    SharePoint Server 2013开发之旅(三):为SharePoint Server配置App开发、部署、管理环境
    SharePoint Server 2013开发之旅(二):使用在线的开发人员网站进行SharePoint App开发
    SharePoint Server 2013开发之旅(一):新的开发平台和典型开发场景介绍
    在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
    一个在ASP.NET中利用服务器控件GridView实现数据增删改查的例子
    关于未捕获异常的处理(WPF)
    牛刀小试:使用Reactive Extensions(Rx),对短时间内多次发生的事件限流
    如何对SharePoint网站进行预热(warmup)以提高响应速度
  • 原文地址:https://www.cnblogs.com/yuliyang/p/3393982.html
Copyright © 2011-2022 走看看