文件批量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);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值