【发布时间】:2021-12-17 18:49:51
【问题描述】:
我有一组 .bin 文件,其中包含正式指定格式的数据。我确切地知道每个字段有多少字节,例如名称 = 40 字节,版本号 = 2 字节等。 我也知道它们存储在文件中的确切顺序(例如名称,然后是版本号......)。
到目前为止,我可以将文件中的数据加载到 std::vector<unsigned char> 列表中,然后单步执行该数据并根据预期字节数读取字段。
问题是,如果我弄错任何字段(有很多不同的字段),这种方法很长并且容易出错。
我已经查看并与人们讨论了结构打包、指针转换和位字段。我似乎无法让他们一起工作。
如何将数据读入缓冲区,然后在缓冲区上“覆盖”我的结构?然后根据我在结构中给每个值分配的位字段填充所有字段。
位域的问题是我不能接受字符串。
建议或示例代码将不胜感激。如果您只想发表评论,我可以为您提供代码来展示我目前所拥有的以及我正在努力实现的目标。
#include <vector>
int main()
{
//File data loaded by function call
std::vector<unsigned char> fileData;
//How do I cast fileData to be a dataFields type?
}
struct dataFields
{
int ID : 8;
// Cannot use bit field for string type?
std::string name;
int versionNumber : 16;
int someOtherValue : 8;
}
由于工作原因,我无法给出我正在处理的确切代码,但我觉得这总结了我在一个简单的庄园中试图做得相当好。
【问题讨论】:
-
请提供一些例子。请阅读stackoverflow.com/help/mcve 另外,您已经标记了 C 和 C++,请标记您使用的确切语言 - C 或 C++。
-
制作一个与您对数据的了解相匹配的打包结构(非打包结构没有您可以依赖的特定内存布局)。使用 memcpy 复制数据(这是人们可以同意合法的一种别名方法)。广泛测试。这是您在这个详细程度所能获得的最多建议。
-
最简单的、不可移植的解决方案是读取一个记录大小的缓冲区并将其转换为结构指针。
-
为什么要使用字符串类型的位域?在这种情况下,您必须使用具有明确规定大小的原始 C 数组:
char name[40]。 -
那么假设您有一个名为
d的dataFields实例,并且fileData向量包含从您的文件加载的二进制数据,您必须使用memcpy:memcpy(&d, &fileData[0], sizeof(dataFields))跨度>
标签: c++ struct file-io binaryfiles