首页 > 解决方案 > 如何将位域写入二进制文件

问题描述

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

我从以前的谷歌搜索中发现的关于此类事情的信息很少,我不知道该怎么做。通常的反应是“没有人使用位域 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 时它不喜欢它

我很感激你能给我的任何帮助

标签: c++iobinarybit-fields

解决方案


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

问题1。

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

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

bitfield obj;

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

问题2:

该语言不允许您获取位域成员的地址。请参阅是否有无法获取地址的变量?


解决方案

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

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

推荐阅读