将boost :: dynamic_bitset转换为字符串可使大小增加8倍

时间:2018-12-07 18:59:08

标签: c++ c++11 boost boost-dynamic-bitset

我正在尝试将boost::dynamic_bitset转换为string,以便可以将其传递给压缩函数。我可以使用boost::to_string进行转换,但它导致的位数增加了8倍。当我从string转换回boost::dynamic_bitset时,它不会减少8倍的位使用量,这将解决我的问题,因为这将最终导致总的使用空间成为原始空间压缩的位数。

我打算从boost::dynamic_bitset-> string停止8倍的增加,或者从boost::dynamic_bitset-> string减少8倍的使用空间。

boost::dynamic_bitset中存储的数据来自二进制文件。 Here is the one I am using,但从理论上讲,任何具有二进制数据的文件都可以使用。

当输出位数时,我正在调用string.size(),它返回以字节为单位的大小,因此为什么要乘以8。boost::dynamic_bitset.size()返回以位为单位的大小,所以我的输出应该假设这是正确的,则将苹果与苹果进行比较。

这是我当前得到的输出:

Dynamic bitset input bits = 6431936
String from dynamic_bitset bits = 51455488
Dynamic bitset from string bits = 51455488

这是我的代码:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <boost/dynamic_bitset.hpp>
#include <boost/math/cstdfloat/cstdfloat_types.hpp>
#include <boost/numeric/conversion/cast.hpp>

typedef boost::float32_t float32;
typedef boost::uint32_t uint32;

int main() {
   std::vector<unsigned char> data;
   unsigned char *cp;
   float32 value = 8.0;
   boost::uint32_t internal;
   std::memcpy( &internal , &value , sizeof( value ) );

   std::ifstream fin("ex.bin", std::ios::binary);

   while (fin.read(reinterpret_cast<char*>(&internal), sizeof(uint32))) {
      std::memcpy( &value, &internal , sizeof( internal ) );
      cp = (unsigned char *)&internal;

      for(int i = 0; i < 4; ++i) {
         data.push_back(*cp);
         ++cp;
      }
   }

   boost::dynamic_bitset<unsigned char> bitset;
   std::string buffer;

   bitset.init_from_block_range(data.begin(), data.end());

   std::cout << "Dynamic bitset input bits = " << bitset.size() << "\n";

   boost::to_string(bitset, buffer);

   std::cout << "String from dynamic_bitset bits = " << buffer.size()*8 << "\n";

   boost::dynamic_bitset<unsigned char> from_str(buffer.begin(), buffer.end());

   std::cout << "Dynamic bitset from string bits = " << from_str.size() << "\n";

   return 0;
}

1 个答案:

答案 0 :(得分:3)

C ++容器上的size()方法习惯上是指元素数,而不是字节数。

std::string::size()给出了字符串中char个值的计数,而boost::dynamic_bitset::size()返回了存储在其中的 bits 个数;当您从n = buffer.size()个8位的“块”中初始化它时(char在几乎任何“正常”平台上都是8位),完全可以预期它返回的大小是8倍。大,而实际消耗的内存完全相同。


编辑 :在上次修改后,问题现在完全不同了。

boost::to_string不输出内部紧凑表示,而是生成由实际的'0''1'字符组成的人类可读字符串,这确实导致所需大小增加了8倍(输出是一个8位字节的序列,其中只有1位有效使用)。