- /*
- *
- *
- * 文件名称: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;
- }
编写ATL工程实现ActiveX控件调用cryptoAPI接口(四)------------Base64转码
最新推荐文章于 2019-04-03 10:32:51 发布