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

How to Write Bitfield to a Binary File

假设我有一个总计 32 位的位域。我想将这些输出到一个二进制文件中,我们称之为 "binary.bin"。如何在不崩溃的情况下解决这个问题 visual studio?

我从以前的 google 搜索中发现的关于此类事情的信息太少了,我不知道该怎么做。通常的回答是 "no one uses bitfields 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 时它不喜欢它

如果你能给我任何帮助,我将不胜感激

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

问题 1.

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

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

bitfield obj;

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

问题 2:

该语言不允许您获取 bit-field 成员的地址。参见


解决方案

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

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

首先你需要声明一个位域类型的变量,而不仅仅是名称为位域的结构体。写入一个 二进制文件:

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