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的更多相关文章
随机推荐
- hibernate查询显示参数
log4j.property改为如下 ### direct log messages to stdout ### log4j.appender.stdout=org.apache.l ...
- MongoDB入门三步曲2--基本操作(续)--聚合、索引、游标及mapReduce
mongodb 基本操作(续)--聚合.索引.游标及mapReduce 目录 聚合操作 MapReduce 游标 索引 聚合操作 像大多关系数据库一样,Mongodb也提供了聚合操作,这里仅列取常见到 ...
- 使用vagrant作为开发环境后,js报错
当你尝试修改一个js,并且用同样的方法更新之后,会遇到类似的问题,是的,就算重启VM上任何服务,甚至重启VM,依旧没有用,当然,比起其他资源文件,浏览器的反应会强烈一些,因为浏览器会提示未知错误,而你 ...
- DevExpress VCL 一键安装工具
一键安装工具 DxAutoInstaller-2.1.3 For Devexpress VCL:http://download.csdn.net/detail/wozengcong/8396181 一 ...
- Jabber Software:Jabber-NET、agsXMPP与Wilefire[转]
本篇介绍两个使用.NET技术,确切的说是使用C#写的Jabber Code Libraries – Jabber.NET.agsXMPP,以及一个Java写的跨平台Jabber Server – Wi ...
- OpenCASCADE 基础
OpenCASCADE 基础 转载▼ 一直在用OCC作项目,但这方面的中文资料很少,看来OCC在中国还不是十分普及: 后来,项目中使用OCC和DirectX结合使用,取得了很好的效果: 随着OCC6. ...
- CODEVS 3000公路修建问题
题目描述 Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Associat ...
- PHP与最丑的后台管理系统
第二天阿Q到公司还是比较早,同事只有阿梅在,阿Q坐在椅子上旋转来旋转去,有点像个小孩子.公司有书柜,书柜上放了好几本很新的php的书,.net的书反倒比较少而且显得老旧.阿Q起身走过去拿了本php翻了 ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理
Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the fa ...
- 图文详解如何搭建Windows的Android C++开发环境
原地址:http://www.apkbus.com/android-18595-1-1.html //================================================= ...