当前位置: 首页 > news >正文

文件批量Base64编码工具

最近项目要求进度太快,在性能测试的时候需要将几百个文件都转为Base64格式的编码,然后存为文件,以供LR调用,在网上找了一大圈都没找到可以批量编码的工具,项目实在时间太紧,没法,自己胡乱写了一个可以对文件夹下面的所有文件批量编码并将编码保存在同一目录下相同文件名的txt文件中,这里将部分关键代码贴出来,以供大家参考,也供日后自己查阅。

Base64.h

#ifndef _BASE64_H
#define _BASE64_H

#ifdef _WIN32
#pragma warning(disable:4514)
#endif

#include <stdio.h>
#include <string>

/** \defgroup util Utilities */

/** Base64 encode/decode. 
    \ingroup util */
class Base64
{
public:
    static inline bool is_base64(unsigned char c) {
        return (isalnum(c) || (c == '+') || (c == '/'));};
    std::string base64_encode(unsigned char const* , unsigned int len);
    std::string base64_encode(std::string const& s);
    std::string base64_decode(unsigned char const* , unsigned int len);
    std::string base64_decode(std::string const& s);
};

#endif // _BASE64_H

Base64.cpp

#include "StdAfx.h"
#include "Base64.h"
#include <iostream>
#include <ctype.h>

static const std::string base64_chars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";

std::string Base64::base64_encode(const std::string &s)
{
    return base64_encode((const unsigned char *)s.c_str(), s.length());
}

std::string Base64::base64_decode(unsigned char const* encoded_string, unsigned int in_len)
{
    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;
}

std::string Base64::base64_encode(unsigned char const* 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;
}

std::string Base64::base64_decode(std::string const& decode_string)
{
    return base64_decode((const unsigned char*)decode_string.c_str(), decode_string.size());
}

调用方法:

    CString DeCodeFilePath,EnCodeFilePath,DeCodeFilePathTemp;
    CFile file, file1;
    int i = 0;
    m_DeCodeFilePath.GetWindowTextA(DeCodeFilePath);
    i = m_strDir.GetSize();
    float bbbbb = 0;
    for (int m = 0; m < i; m++)
    {
        EnCodeFilePath = m_strDir.GetAt(m);
        file.Open(EnCodeFilePath, CFile::modeRead);
        int Length = file.GetLength();
        char *pBuffer = new char[Length];
        file.Read(pBuffer, Length);

        unsigned int outLen, outLen1;
        unsigned const char *a = (unsigned const char*)pBuffer;
        unsigned char *b = new unsigned char[Length * 5];
        outLen1 = base64_encode(a, Length, b, outLen);
        file.Close();
        DeCodeFilePathTemp = EnCodeFilePath;
        int pos = EnCodeFilePath.ReverseFind('.');
        if (pos > 0)
            EnCodeFilePath = EnCodeFilePath.Left(pos) + ".txt";
        file1.Open(EnCodeFilePath, CFile::modeWrite | CFile::modeCreate);
        file1.SetLength(0);
        file1.Write(b, outLen1);
        file1.Close();
        bbbbb = (m + 1) / i;
        m_ProgressCtrl.SetPos((int)bbbbb*100);
    }

相关文章:

  • Windows下批处理方式压缩文件夹为tar.gz的方法
  • RFS(六)Open Browser后,页面显示This is the initial start page for the WebDriver server.的解决办法
  • 解决在Windows server 2012R2上无法安装Intel I219-V,I211,I217-V,I218-V网卡驱动的问题
  • 谈谈在Windows7 x86上,H170芯片组和H150芯片组可用内存只有2.1G的问题
  • 解决在H170/B150主板不接显示器无法正常开机的问题
  • 有关Intel主板驱动静默安装的一个坑
  • 有关Windows免密码登陆远程桌面的两种实现方法
  • Advanced Installer 中测试数据库连接提示“未发现数据源名称并且未指定默认驱动程序”的解决办法
  • SSD硬盘在检测中出现数据损坏的处理
  • Advanced Installer (一)初见
  • Advanced Installer 安装前卸载旧版本的办法
  • 浅谈HTTP和HTTPS
  • LoadRunner(三)再识web_custom_request函数
  • VC++获取不同Windows版本的方法
  • 解决VS2012/VS2013/VS2015下编译的程序无法在XP下运行的问题
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • Java精华积累:初学者都应该搞懂的问题
  • JS笔记四:作用域、变量(函数)提升
  • js学习笔记
  • Laravel Telescope:优雅的应用调试工具
  • MySQL数据库运维之数据恢复
  • MySQL主从复制读写分离及奇怪的问题
  • PAT A1092
  • Python语法速览与机器学习开发环境搭建
  • vue-cli3搭建项目
  • 初识 webpack
  • 回顾2016
  • 马上搞懂 GeoJSON
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 排序算法学习笔记
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何胜任知名企业的商业数据分析师?
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 手写双向链表LinkedList的几个常用功能
  • 一份游戏开发学习路线
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 原生 js 实现移动端 Touch 滑动反弹
  • 正则表达式小结
  • 阿里云ACE认证之理解CDN技术
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #Linux(make工具和makefile文件以及makefile语法)
  • $forceUpdate()函数
  • (1) caustics\
  • (C++17) optional的使用
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十六)串口UART
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core 通过 Ef Core 操作 Mysql