base64dll

时间:2023-03-10 08:04:58
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] = '\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


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;
}

结果图:

base64dll

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

提供自己的base64dll 一份

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