如何将位域写入二进制文件

时间:2019-06-21 16:23:53

标签: c++ io binary bit-fields

让我们说我有一个总计32位的位域。我想将它们输出到二进制文件中,让我们将其称为“ binary.bin”。我该如何解决而又不会使Visual Studio崩溃?

在以前的Google搜索中,我发现的信息很少,我不知道该怎么办。通常的回答是“没人使用lmao位域”,但事实证明我需要使用位域进行工作。

我知道位域有时会低于8位,这使得它不可能适应一个字节,这使它很难处理,但这并不意味着我不能将32位位域放入一个二进制文件,对吧?

我在其他地方找到了有关打印到二进制文件的信息,希望它能起作用。

struct bitfield {

    unsigned int     b1 : 22; 
    unsigned int     b2 : 4;
    unsigned int     b3 : 5;
    unsigned int     b4 : 1; 
};
int main(){

    std::ofstream ofile("binary.bin", std::ios::binary);
    ofile.write((char*)&bitfield.b1, sizeof(unsigned int));

    return 0;
}

这甚至不起作用,我也不知道为什么,当我说bitfield.b1时,它不喜欢它

非常感谢您能为我提供的帮助?

2 个答案:

答案 0 :(得分:1)

我注意到您发布的代码中有两个问题。

问题1。

您需要一个对象来将其内容保存到文件中,而不是类型及其成员。

从这个角度来看,表达式bitfield.b1是不正确的。您需要:

bitfield obj;

之后,您可以使用obj.b1来引用该成员。

问题2:

该语言不允许您获取位域成员的地址。参见Are there any variables whose address can not be obtained?


解决方案

创建一个对象并将整个对象保存到文件中,而不仅仅是位字段。

std::ofstream ofile("binary.bin", std::ios::binary);
bitfield obj;
ofile.write(retinterpret_cast<char*>(&obj), sizeof(obj));

答案 1 :(得分:0)

首先,您需要声明一个类型为bitfield的变量,而不仅仅是声明名称为bitfield的结构。写到 二进制文件:

bitfield bf;
... some value sett
FILE *f=fopen("binary.bin","wb");
fwrite(&bf,sizeof(bf),1,f);
fclose(f);