您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页C++文件转base字符串的代码_从网上抄了些_但我做了优化_1G数据从9秒优化到了1秒...

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

来源:保捱科技网

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

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

2.使用char* 代替string 对象


示例备份: s3tx


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

#include "pch.h"
#include "FileDataToBaseString.h"

namespace FileDataToBaseString0507
{


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

}

void FileDataToBaseString(const uint8_t* const input, std::string &out, size_t srcSize)
{
	using namespace FileDataToBaseString0507;
	{
		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 FileDataToBaseString(const uint8_t* const input, char* &out, size_t srcSize)
{
	using namespace FileDataToBaseString0507;
	{
		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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务