我想从/向二进制文件读取和写入n位。 例如,将下n位读入整数或下n位 到一个char。我需要数据位对齐而不是字节对齐。
是否有允许我这样做的C ++库?
当我使用ostream / istream时,我似乎被限制为使用字节对齐 数据。如果我希望我的数据紧密打包,这还不够好。
答案 0 :(得分:1)
当然,如果您自己进行位级访问,则字节对齐访问“足够好”。 :)
Here是一个“bitfile”库,听起来像你想要的。我自己没有测试过,但听起来相当简约。
答案 1 :(得分:0)
您可以使用以下步骤从二进制文件中读取位。
使用mmap将二进制数据文件映射到内存中。如果您的文件大小不是字节的倍数,那么您将在映射的内存区域的末尾添加填充位。填充位数可以是1到7之间的任何值。
现在,您可以使用位掩码从内存映射区域读取所需的位。请注意,您需要使用按位AND操作。位掩码的价值在little-endian和big-endian平台上会有所不同。因此,代码不可移植,需要特别注意便携性。
此外,您可能还需要使用按位向右或向左旋转运算符。
您也可以使用位字段将部分映射内存区域类型转换为C ++数据结构。在这里,我们需要指示编译器不要在C ++结构中使用填充来进行字节对齐。这可以使用“#PRAGMA PACK(1)”指令来实现。同样,具有位字段的C ++结构在小端和大端平台上不可移植。
上述方法的小变化可用于将位写入二进制文件。