代码执行效率优化的几个关键点: 1.使用一个编码数组, 解决掉编码中的一些判断与加减运算算法
//编码表 const static char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2.使用char* 代替string 对象数组
示例备份: https://pan.baidu.com/s/1tfMNne6bkvg8GYDCTdhpfw s3tx函数
关键代码: FileDataToBase64String 这个函数有个char*版本fetch
#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; } }