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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    ASE19团队项目 beta阶段 model组 scrum report list
    ASE19团队项目 beta阶段 model组 scrum7 记录
    ASE19团队项目 beta阶段 model组 scrum6 记录
    ASE19团队项目 beta阶段 model组 scrum5 记录
    ASE19团队项目 beta阶段 model组 scrum4 记录
    ASE19团队项目 beta阶段 model组 scrum3 记录
    ASE19团队项目 beta阶段 model组 scrum2 记录
    ASE19团队项目 beta阶段 model组 scrum1 记录
    【ASE模型组】Hint::neural 模型与case study
    【ASE高级软件工程】第二次结对作业
  • 原文地址:https://www.cnblogs.com/yuliyang/p/3393982.html
Copyright © 2011-2022 走看看