从二进制文件读取和写入位

时间:2010-01-13 15:31:34

标签: c++ parsing binaryfiles writing

我想从/向二进制文件读取和写入n位。 例如,将下n位读入整数或下n位 到一个char。我需要数据位对齐而不是字节对齐。

是否有允许我这样做的C ++库?

当我使用ostream / istream时,我似乎被限制为使用字节对齐 数据。如果我希望我的数据紧密打包,这还不够好。

2 个答案:

答案 0 :(得分:1)

当然,如果您自己进行位级访问,则字节对齐访问“足够好”。 :)

Here是一个“bitfile”库,听起来像你想要的。我自己没有测试过,但听起来相当简约。

答案 1 :(得分:0)

您可以使用以下步骤从二进制文件中读取位。

  1. 使用mmap将二进制数据文件映射到内存中。如果您的文件大小不是字节的倍数,那么您将在映射的内存区域的末尾添加填充位。填充位数可以是1到7之间的任何值。

  2. 现在,您可以使用位掩码从内存映射区域读取所需的位。请注意,您需要使用按位AND操作。位掩码的价值在little-endian和big-endian平台上会有所不同。因此,代码不可移植,需要特别注意便携性。

  3. 此外,您可能还需要使用按位向右或向左旋转运算符。

  4. 您也可以使用位字段将部分映射内存区域类型转换为C ++数据结构。在这里,我们需要指示编译器不要在C ++结构中使用填充来进行字节对齐。这可以使用“#PRAGMA PACK(1)”指令来实现。同样,具有位字段的C ++结构在小端和大端平台上不可移植。

    上述方法的小变化可用于将位写入二进制文件。