以二进制格式读取文件,并以字符串存储二进制数据

问题描述 投票:0回答:1

我想做的事情。
以二进制格式读取文件,保存为十六进制字符串,并显示给用户

我做了什么。
1. 以二进制格式打开文件,
2. 读取前两个字节,因为它是大小。
3.根据大小读取,存入向量中。
4. 将读取的值从整数转换为十六进制字符串格式。
5. 重复步骤2、3、4,直到文件结束

我已经确认下面的示例代码可以正常工作。但问题是,当二进制文件的大小超过 MB 单位时,仅转换它就需要大约 10 秒。在 for 循环中将字符串一一连接并单独转换它们似乎非常耗时。我很好奇是否有更快的方法来执行相同的操作。


enter image description here


啊啊啊
BBBB
抄送

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 循环中将字符串一一连接并单独转换它们似乎非常耗时。我很好奇是否有更快的方法来执行相同的操作。

c++ ifstream
1个回答
0
投票

一般来说,您应该进行分析以确定程序中最慢的部分是什么。分析的结果是每行代码在执行过程中所花费时间的百分比。然后取百分比最高的(问题最多的线路)并尝试改进它。

例如,假设代码中最慢的行是

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);

但是只有在确定它们有效之后(在分析之后)才进行此类优化。

© www.soinside.com 2019 - 2024. All rights reserved.