编写ATL工程实现ActiveX控件调用cryptoAPI接口(四)------------Base64转码
来源:互联网 发布:盐城平面设计软件培训 编辑:程序博客网 时间:2024/04/28 08:47
- /*
- *
- *
- * 文件名称:base64.cpp
- * 摘 要:
- * 当前版本:1.0
- * 作 者:周绍禹
- * 创建日期:2012年3月3日
- */
- #include "stdafx.h"
- #include "base64.h"
- //-----------------------------------------------------------
- // 函数名称:
- // Base64::base64_encode
- // 参数:
- // - const BYTE* bytes_to_encode 待编码的字节数组
- // - int lenth 字节数组大小
- // 返回:
- // string base64编码的字符串
- // 说明:
- // 将字节数组以base64编码格式编码字符串
- //-----------------------------------------------------------
- string Base64::base64_encode(const BYTE* bytes_to_encode,int lenth)
- {
- string ret;
- int i = 0;
- int j = 0;
- unsigned char char_array_3[3];
- unsigned char char_array_4[4];
- const string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- while (lenth--) {
- 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;
- }
- //-----------------------------------------------------------
- // 函数名称:
- // Base64::base64_decode
- // 参数:
- // - const string encoded_string base64编码格式的字符串
- // - int& length 返回解码后的字节数组大小
- // 返回:
- // BYTE* 解码后的字节数组
- // 说明:
- // 解码base64编码的字符串
- //-----------------------------------------------------------
- BYTE* Base64::base64_decode(const string encoded_string,int& length)
- {
- 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];
- string ret;
- const string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- 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];
- }
- length = ret.size();
- return str2bytes(ret);
- }
- //-----------------------------------------------------------
- // 函数名称:
- // Base64::is_base64
- // 参数:
- // - unsigned char c 待验证字符
- // 返回:
- // bool 是否为base64字符
- // 说明:
- // 验证字符是否为base64字符
- //-----------------------------------------------------------
- bool Base64::is_base64(unsigned char c) {
- return (isalnum(c) || (c == '+') || (c == '/'));
- }
- //-----------------------------------------------------------
- // 函数名称:
- // Base64::str2bytes
- // 参数:
- // - string target 目标字符串
- // 返回:
- // BYTE* 字符串的字节数组
- // 说明:
- // 获取字符串的字节数组
- //-----------------------------------------------------------
- BYTE* Base64::str2bytes(string target)
- {
- int size = target.size();
- BYTE* u_ch=new BYTE[size + 1];
- for(int i = 0 ; i < size; i++)
- {
- *(u_ch + i) = target[i];
- }
- u_ch[size] = '\0';
- return u_ch;
- }
0 0
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(四)------------Base64转码
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(四)------------Base64转码
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(五)------------获取证书转成Base64码
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(一)------------签名与验证
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(二)------------信封加密与解密
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(三)------------AES对称加密与解密
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(三)------------AES对称加密与解密
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(二)------------信封加密与解密
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(一)------------签名与验证
- C++基于ATL工程编写ActiveX控件
- C++基于ATL工程编写ActiveX控件
- 编写 ATL ActiveX 控件
- C++基于ATL工程编写安全的ActiveX控件
- C++基于ATL工程编写ActiveX控件步骤
- ATL 支持ActiveX控件开发的所实现的接口
- 给ATL ActiveX控件添加安全接口
- ATL开发的activex要放上网能调用方法要先实现安全接口
- vs2012 ATL编写activex(一)
- 【翻译自mos文章】OGG的Director界面 显示mgr进程是红色的叉号,其实mgr是up的状态
- jQuery ui
- SBT平衡树
- 机器学习:贝叶斯总结_4:分类
- [BZOJ3172][TJOI2013]单词(AC自动机+fail树)
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(四)------------Base64转码
- Jmeter与Jenkins的集成
- 程序的灵魂 ---算法
- 读时间管理幸福
- jQuery学习笔记之unbind()
- java简单实现网络爬虫
- 单元测试 : No Session found for current thread
- 工作一年之后的感受
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(三)------------AES对称加密与解密