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.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 一份
base64dll的更多相关文章
随机推荐
- php 开启缓冲,页面纯静态化
服务器默认不开启php缓冲区 两种方法开启 1.php.ini out_put_buffer = on 2.ob_start(); 页面纯静态化 file_put_contents()写文件 ob_s ...
- HTML meta viewport属性说明
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤 到很小的窗口中(这样会破坏没有针对手 ...
- MVC-Model数据注解(三)-Remote验证的一个注意事项
首先,一般来说对于一个属性的验证可能需要不止一个的远程验证,比如对于用户名来说,我们需要对于它的长度做一些限制,这个可以通过StringLength特性来解决:同时还需要验证用户名不能重复,这个就需要 ...
- CODEVS 3000公路修建问题
题目描述 Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Associat ...
- DB天气app冲刺第六天
更改计划 以前是准备完全自己写一个天气App 而且加上自己已经成功的做了一个安卓开发的小例子了,就感觉可以做的出来了.结果这五天证明自己一开始的思路就错了.所以上次跟别的同学问了一下.看了一下他们的方 ...
- sqlserver分页;mysql分页;orcale分页 的sql 查询语句
一,sqlserver分页: )) ID FROM 表名 AS 表名1_1 ORDER BY ID)) ORDER BY ID; 二:mysql分页 )*每页显示的数据条数,当前页码 * 每页显示的数 ...
- 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...
- c++重载与覆写
重载:指子类改写了父类的方法,覆写:指同一个函数,同样的参数列表,同样的返回值的,但是函数内部的实现过程不同. 重载: 1.方法名必须相同. 2.参数列表必须不相同,与参数列表的顺序无关. 3.返回值 ...
- Oracle DB优化
http://www.jb51.net/article/77876.htm http://www.jb51.net/article/56881.htm http://danni505.blog.51c ...
- HDU 2844 Coins(多重背包)
点我看题目 题意 :Whuacmers有n种硬币,分别是面值为A1,A2,.....,An,每一种面值的硬币的数量分别是C1,C2,......,Cn,Whuacmers想买钱包,但是想给人家刚好的钱 ...