2010-01-13 164 views
2

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

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

当我使用ostream/istream时,我似乎被限制使用字节对齐的 数据。如果我想要将数据紧紧包装,这还不够好。

+0

为什么你需要紧紧地打包你的数据?您是否考虑过使用压缩库(例如.zlib)?这对你来说会更容易,并且占用更少的空间。 – 2010-01-13 17:06:48

+0

你的位是否捆绑成字节对齐的块?如果是这样,您可以正常读取字节,并使用位移和位掩码获取位。 – 2010-01-13 20:24:59

回答

1

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

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

+0

链接死了,而源不在archve.org – MarcusJ 2015-05-04 10:12:18

+1

@MarcusJ谢谢,我换了另一个(未经测试的)面向位的I/O库。 – unwind 2015-05-04 10:17:25

+0

谢谢,我在编写我自己的读取器时遇到了困难(特别是涉及到endian swapping,希望int支持而不是读为char等) – MarcusJ 2015-05-04 10:32:03

0

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

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

  2. 现在,您可以使用位掩码从存储器映射区域读取所需的位。请注意,您需要使用按位“与”操作。在小端和大端平台上,位掩码的值会有所不同。因此,代码将不可移植,需要额外的便携性。

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

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

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

相关问题