繁体   English   中英

将整个二进制文件读入缓冲区,然后以特定格式解析

[英]read the whole binary into a buffer then resolve it in specific format

这是我的C ++作业。 给定一个二进制文件,该文件包含一些数据单元。 每个数据单元包含两个部分。 第一部分为1 char ,第二部分为1 int 一次将整个文件读入缓冲区,然后从缓冲区中提取所有数据单元。 现在,我已成功将文件读入缓冲区,如下所示:

char* readBinaryFile(const char* fileName) {
    ifstream file(fileName, ios::binary || ios::ate);

    // get the size of file
    streampos beg, end;
    beg = file.tellg();
    file.seekg(0,ios::end);
    end = file.tellg();
    long size = end - beg;

    char* buffer = new char[size];

    // now read the file into buffer
    file.seekg(0, ios::beg);
    file.read(buffer, size);
    file.close();

    return buffer;
}

所以我的问题是如何从缓冲区中获取数据单元?

我不会为您编写代码,请片刻考虑一下...

buffer[0]是您的第一个字符。 buffer[1]buffer[4]是您的第一个整数。 它会重复,因此buffer[5]是第二组数据的字符。

字符和int总共有五个字节。 如果您知道所读取的数据量,则可以将其除以5,然后知道其中有“数据集”的数量。

现在,您可以使用诸如for循环之类的for从零迭代到集数减一。 假设这个迭代器变量是i ,那么您可以使用buffer[i * 5] ,int在buffer[i * 5 + 1]处的第一个字节等访问数据的每个“集合”的字符。

因此,一个for循环和一些数学运算将帮助您从该缓冲区中提取信息。 您将拥有5个单独的字节,并且需要将其中的4个字节重组为一个int。 有多种方法可以实现此目的,我将让您尝试发现。

您的问题可能源于您正在使用的事实:

ios::binary || ios::ate

当我认为你的意思是:

ios::binary | ios::ate

前者的计算结果为“ 1”,因为二进制逻辑或末尾为“ true”,而后者则是一个位掩码,表示“以二进制模式并在末尾打开此文件”。 您编写的方式实际上等同于

ios::app

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM