我正在尝试将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;
}
答案 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位有效使用)。