我想做的事情。
以二进制格式读取文件,保存为十六进制字符串,并显示给用户
我做了什么。
1. 以二进制格式打开文件,
2. 读取前两个字节,因为它是大小。
3.根据大小读取,存入向量中。
4. 将读取的值从整数转换为十六进制字符串格式。
5. 重复步骤2、3、4,直到文件结束
我已经确认下面的示例代码可以正常工作。但问题是,当二进制文件的大小超过 MB 单位时,仅转换它就需要大约 10 秒。在 for 循环中将字符串一一连接并单独转换它们似乎非常耗时。我很好奇是否有更快的方法来执行相同的操作。
std::ifstream is(PATH, std::ios::in | std::ifstream::binary)
int index = 0;
std::string str;
if(is)
{
while(is.peek() != EOF)
{
char len[2] = {0, 0};
is.read(len, 2);
int size = len[0] | len[1]<<8;
std::vector<uint8_t> buf;
buf.resize(size);
is.seekg(index+2);
index = index + size + 2;
is.read((char*)&buf[0], size);
for(int i = 0 ; i<buf.size(); i++)
{
char tmp[3];
sprintf(tmp, "%02x", buf[i]);
str+=tmp;
}
str+="\n";
}
}
printf("%s\n", str.c_str());
我已经确认下面的示例代码可以正常工作。但问题是,当二进制文件的大小超过 MB 单位时,仅转换它就需要大约 10 秒。在 for 循环中将字符串一一连接并单独转换它们似乎非常耗时。我很好奇是否有更快的方法来执行相同的操作。
一般来说,您应该进行分析以确定程序中最慢的部分是什么。分析的结果是每行代码在执行过程中所花费时间的百分比。然后取百分比最高的(问题最多的线路)并尝试改进它。
例如,假设代码中最慢的行是
sprintf
。您可以使用低级替代方案,例如手动生成十六进制数字:
tmp[0] = buf[i] / 16 + (buf[i] / 16 < 10 ? '0' : 'a' - 10);
tmp[1] = buf[i] % 16 + (buf[i] % 16 < 10 ? '0' : 'a' - 10);
但是只有在确定它们有效之后(在分析之后)才进行此类优化。