C++文件转base64字符串的代码_从网上抄了些_但我做了优化_1G数据从9秒优化到了1秒...

代码执行效率优化的几个关键点: 1.使用一个编码数组, 解决掉编码中的一些判断与加减运算

//编码表  
const static char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

2.使用char* 代替string 对象


示例备份: https://pan.baidu.com/s/1tfMNne6bkvg8GYDCTdhpfw s3tx


关键代码: FileDataToBase64String 这个函数有个char*版本

#include "pch.h"
#include "FileDataToBase64String.h"

namespace FileDataToBase64String0507
{


//编码表  
const static char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static uint8_t  encode(int value)
{
	return EncodeTable[value & 0x3f];
}

}

void FileDataToBase64String(const uint8_t* const input, std::string &out, size_t srcSize)
{
	using namespace FileDataToBase64String0507;
	{
		out.clear();

		size_t i, value;

		//step1:
		size_t equal_count = (3 - srcSize % 3) % 3;// 0或1或2  // 需补等号的数目
		size_t count333 = srcSize - (3 - equal_count);// 

		size_t stringSize = srcSize * 1.4;
		//std::cout << "原文件大小:" << srcSize << "预计转后大小:" << stringSize << "大小计算2:" << count333/3*4+ equal_count << std::endl;
		//out.resize(stringSize);

		for (i = 0; i < count333;) {
			value = input[i++] << 16;
			value |= input[i++] << 8;
			value |= input[i++];

			out += encode(value >> 18);
			out += encode(value >> 12);
			out += encode(value >> 6);
			out += encode(value);
		}

		switch (equal_count)
		{
		case 2:
			value = input[i++] << 16; /* fetch first byte */
			out += encode(value >> 18);
			out += encode(value >> 12);
			out += "==";
			break;
		case 1:
			value = input[i++] << 16; /* fetch first byte */
			value |= input[i++] << 8; 
			out += encode(value >> 18);
			out += encode(value >> 12);
			out += encode(value >> 6);
			out += "=";
			break;
		}
	}
	
	//std::cout << "最后字串大小:" << out.size() <<"\tlength:"<< out.length() << std::endl;
}


void FileDataToBase64String(const uint8_t* const input, char* &out, size_t srcSize)
{
	using namespace FileDataToBase64String0507;
	{
		size_t i, value;

		//step1:
		size_t equal_count_2 = srcSize % 3;// 0或1或2  // 需补等号的数目
		size_t count333 = srcSize - equal_count_2;// 

		size_t stringIndex = 0;
		size_t stringAllocate = (count333 / 3 + 1) * 4;
		out = (char*)malloc(stringAllocate);
		//std::cout << "分配给字串的内存大小:"<< stringAllocate <<"\t之前错的算法是:"<< (count333 + 1) / 3 * 4 << std::endl;

		for (i = 0; i < count333; i += 3) {
			value = input[i] << 16 | input[i+1] << 8  | input[i+2];
			
			out[stringIndex++] = EncodeTable[value >> 18 & 0x3f]; // encode(value >> 18);
			out[stringIndex++] = EncodeTable[value >> 12 & 0x3f]; // encode(value >> 12);
			out[stringIndex++] = EncodeTable[value >> 6 & 0x3f];  // encode(value >> 6);
			out[stringIndex++] = EncodeTable[value & 0x3f];		  // encode(value);
		}

		switch (equal_count_2)
		{
		case 1:// 从2改成1 意义是: 除3余1的情况下, 需补两等号
			value = input[i++]; /* fetch first byte */
			out[stringIndex++] = encode(value >> 6);
			out[stringIndex++] = encode(value);
			out[stringIndex++] = '=';
			out[stringIndex++] = '=';
			break;
		case 2:
			value = input[i++] << 8; /* fetch first byte */
			value |= input[i++] ;
			out[stringIndex++]= encode(value >> 12);
			out[stringIndex++]= encode(value >> 6);
			out[stringIndex++]= encode(value);
			out[stringIndex++]= '=';
			break;
		}

		//std::cout << "最后,字串所占内存:" << stringIndex << std::endl;
	}
}

转载于:https://my.oschina.net/u/235558/blog/3046701

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值