C++ 二进制文件的位对齐读写

C++ 二进制文件的位对齐读写,c++,parsing,binaryfiles,writing,C++,Parsing,Binaryfiles,Writing,我想从二进制文件读写n位。 例如,将下一个n位读入整数或下一个n位 到一个字符。我需要的数据位对齐,而不是字节对齐 P>有C++库允许我这样做吗?< /P> 当我使用ostream/istream时,我似乎仅限于使用字节对齐 数据。如果我想将数据紧凑地打包,这还不够好。如果您自己进行位级访问,字节对齐访问当然是“足够好的”。) 是一个“位文件”库,听起来像你想要的。我自己还没有测试过,但它听起来相当简单。字节对齐访问“足够好”,当然,如果您自己进行位级访问的话。:) 是一个“位文件”库,听起来

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

<> P>有C++库允许我这样做吗?< /P> 当我使用ostream/istream时,我似乎仅限于使用字节对齐 数据。如果我想将数据紧凑地打包,这还不够好。

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

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

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


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

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

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

  • 现在,您可以使用位掩码从内存映射区域读取所需位。请注意,您需要使用位AND运算符。位掩码的值在小端和大端平台上会有所不同。因此,代码将不可移植,需要特别注意可移植性

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

  • <>您也可以将映射内存区域的CAST部分作为具有位字段的C++数据结构。这里,我们需要指导编译器不要在C++结构中使用填充来进行字节对齐。这可以使用“#PRAGMA PACK(1)”指令实现。同样,带有位字段的C++结构在小的Endiad和大的Endiad平台上是不可移植的。
    上述方法的微小变化可用于将位写入二进制文件。

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

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

  • 现在,您可以使用位掩码从内存映射区域读取所需位。请注意,您需要使用位AND运算符。位掩码的值在小端和大端平台上会有所不同。因此,代码将不可移植,需要特别注意可移植性

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

  • <>您也可以将映射内存区域的CAST部分作为具有位字段的C++数据结构。这里,我们需要指导编译器不要在C++结构中使用填充来进行字节对齐。这可以使用“#PRAGMA PACK(1)”指令实现。同样,带有位字段的C++结构在小的Endiad和大的Endiad平台上是不可移植的。
    上述方法的微小变化可用于将位写入二进制文件。

    为什么需要将数据打包得如此紧密?您是否考虑过使用压缩库(如zlib)来代替?这对您来说会更容易,而且占用的空间可能会更少。您的位是否绑定到字节对齐的块中?如果是这样,您可以正常读取字节,并使用位移位和位掩码获取位。为什么您需要将数据打包得如此紧密?您是否考虑过使用压缩库(如zlib)来代替?这对您来说会更容易,而且占用的空间可能会更少。您的位是否绑定到字节对齐的块中?如果是这样,您可以正常读取字节,并使用位移位和位掩码获取位。链接失效,并且源不在archve上。org@MarcusJ谢谢,我换了另一个(未经测试的)面向位的I/O库。谢谢,我在编写自己的位阅读器时遇到了麻烦(特别是当涉及到endian交换时,希望是int支持,而不是读取字符等)链接已经死了,并且源代码不在archve上。org@MarcusJ谢谢,我换了另一个(未经测试的)面向位的I/O库。谢谢,我在编写自己的位阅读器时遇到了麻烦(特别是当涉及到endian交换时,希望支持int而不是作为字符读取,等等)