0

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

我希望从 -> 开始时停止 8 倍增加,或者从boost::dynamic_bitset->开始string时减少 8 倍使用的空间。boost::dynamic_bitsetstring

存储的数据boost::dynamic_bitset来自二进制文件。这是我正在使用的,但理论上任何具有二进制数据的文件都应该可以工作。

当输出位数时,我调用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;
}
4

1 回答 1

4

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

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


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

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

于 2018-12-07T19:41:35.300 回答