【问题标题】:Bit aligned reading and writing from binary files [closed]从二进制文件进行位对齐读写[关闭]
【发布时间】:2010-01-13 15:31:33
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么需要如此紧密地打包数据?您是否考虑过使用压缩库(例如 zlib)?这对您来说会更轻松,并且可能占用更少的空间。
  • 您的位是否捆绑到字节对齐的块中?如果是这样,您可以正常读取字节并使用位移位和位掩码获取位。

标签: c++ parsing binaryfiles writing


【解决方案1】:

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

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

【讨论】:

  • 链接已失效,并且来源不在 archve.org 上
  • @MarcusJ 谢谢,我换了另一个(未经测试的)面向位的 I/O 库。
  • 谢谢,我在编写自己的位阅读器时遇到了麻烦(尤其是在字节序交换方面,希望支持 int 而不是读取为 char 等)
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2018-07-26
    • 2016-06-14
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多