1

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

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

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

4

2 回答 2

1

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

是一个听起来像您想要的“位文件”库。我自己没有测试过这个,但它听起来相当简约。

于 2010-01-13T15:33:41.217 回答
0

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

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

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

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

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

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

于 2010-01-13T17:04:20.197 回答