继上次的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] = '\0'; 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; }
导出函数如下:
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:\n" << encoded << std::endl; std::cout << "decoded:\n" << 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:\n" << encoded2 << std::endl; std::cout << "decoded:\n" << decoded2 << std::endl; return 0; }
结果图:
下次继续把hmac-sha1,urlencode封装成DLL文件
提供自己的base64dll 一份