我想读取和写入二进制文件中的n位。 例如,将接下来的n位读入一个整数或接下来的n位 中的字符。我需要将数据进行位对齐,而不是字节对齐。从二进制文件读取和写入位对齐
是否有C++库允许我这样做?
当我使用ostream/istream时,我似乎被限制使用字节对齐的 数据。如果我想要将数据紧紧包装,这还不够好。
我想读取和写入二进制文件中的n位。 例如,将接下来的n位读入一个整数或接下来的n位 中的字符。我需要将数据进行位对齐,而不是字节对齐。从二进制文件读取和写入位对齐
是否有C++库允许我这样做?
当我使用ostream/istream时,我似乎被限制使用字节对齐的 数据。如果我想要将数据紧紧包装,这还不够好。
您可以使用以下步骤从二进制文件读取位。
使用mmap将二进制数据文件映射到内存中。如果文件大小不是字节的倍数,那么在映射的内存区域的末尾会有填充位。填充位的数量可以是1到7之间的任何值。
现在,您可以使用位掩码从存储器映射区域读取所需的位。请注意,您需要使用按位“与”操作。在小端和大端平台上,位掩码的值会有所不同。因此,代码将不可移植,需要额外的便携性。
此外,您可能还需要使用按位向左或向右旋转运算符。
您还可以将映射的内存区域的一部分作为具有位域的C++数据结构进行类型转换。在这里,我们需要指示编译器不要在C++结构体中使用填充来进行字节对齐。这可以使用“#PRAGMA PACK(1)”指令来实现。同样,具有位域的C++结构在小端和大端平台上不可移植。
上述方法中的小变化可用于将位写入二进制文件。
为什么你需要紧紧地打包你的数据?您是否考虑过使用压缩库(例如.zlib)?这对你来说会更容易,并且占用更少的空间。 – 2010-01-13 17:06:48
你的位是否捆绑成字节对齐的块?如果是这样,您可以正常读取字节,并使用位移和位掩码获取位。 – 2010-01-13 20:24:59