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的更多相关文章
随机推荐
- 怎么用程序获取远程url执行后的图片地址
远程URL:https://121.199.16.229:8890/generate.cgi?rbid=1001&esn=22021434025005&pic=png&coun ...
- Jqery之select操作
jquery获取select选择的文本与值 获取select : 获取select 选中的 text : $("#ddlregtype").find("optio ...
- MySQL基础学习之数据库
创建一个新的数据库 create database 数据库名称; 查看所有数据库 show databases; 删除数据库 drop database 数据库名称
- 网页制作常见的面试题(怎样兼容IE6/IE7/火狐浏览器)
1.IE6双边距问题? 在IE6的浏览器中明明设置的是10px的margin却为什么显示的是20px的margin其实这个Ie6的一个双边距BUG例如:<style type="tex ...
- Linux下GPIO驱动(三) ----gpio_desc()的分析
上篇最后提出的疑问是结构体gpio_chip中的成员函数set等是怎么实现的,在回答之前先介绍下gpio_desc这个结构体. 如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其 ...
- Apache服务器部署ASP.NET网站
资源罗列: apache如何支持asp.net 用 Apache 发布 ASP.NET 网站
- FatFsVersion0.01源码分析
目录 一.API的函数功能简述 二.FATFS主要数据结构 1.FAT32文件系统的结构 2.FATFS主要数据结构 ① FATFS ② DIR ③ FIL ④ FILINFO ⑤ wi ...
- JS获取IP、MAC和主机名的几种方法
方法一(只针对IE且客户端的IE允许AcitiveX运行,通过平台:XP,SERVER03,2000): 获取客户端IP. <HTML> <HEAD> <TITLE> ...
- Xplico
http://zhulinu.blog.51cto.com/539189/850909
- easyui源码翻译1.32--Messager(消息窗口)
前言 使用$.messager.defaults重写默认值对象.下载该插件翻译源码 消息窗口提供了不同的消息框风格,包含alert(警告框), confirm(确认框), prompt(提示框), p ...