3

我有一个代表 74MB 文件的所有位的大量位集。我正在使用压缩算法来创建此位集的压缩字符串表示。然后我需要将该字符串存储到另一个动态位集中,以便稍后对其进行解压缩。我的问题是,无论我如何尝试从字符串中填充位集,它总是以相反的顺序填充。

为简单起见,假设我的压缩字符串是

1110001101010111011101

这是我第一次尝试填充输出动态位集:

string compressed = 1110001101010111011101;
output = boost::dynamic_bitset<unsigned char> (compressed);

当我这样做时,我的 bitset 变成了字符串的反转:

   1011101110101011000111

所以我尝试了这个:

output = boost::dynamic_bitset<unsigned char> (compressed.begin(), compressed.end());

我得到完全相同的输出。接下来我尝试使用反向迭代器,我不知道这是怎么可能的,但它以完全相同的方式填充位集:

output = boost::dynamic_bitset<unsigned char> (compressed.rbegin(), compressed.rend());

我可以让我的 bitset 以正确的顺序填充的唯一方法是这样做:

for(uint i = 0; i < compressed.size(); i++)
{
    if(compressed[i] == '0') 
       output.push_back(false);
    else output.push_back(true);
}

这会以正确的顺序填充我的输出位集,但是它比使用其他方法慢得多(我正在使用的字符串慢 30 秒)。我还可以使用 std::reverse 将字符串反转到位然后填充位集,但这需要很多额外的时间。有什么方法可以有效地用正常排序的字符串中的值填充动态位集?我理解为什么它是反向填充的,但我没有使用我的位集来表示一个整数,我使用它来存储文件中的数据,所以我需要它是有序的。然而,为什么使用反向迭代器会产生相同的输出是没有意义的。

编辑我已经截取了我的输出和我的代码的相关部分。压缩输出显示了我的 bitset 压缩版本的前 6000 个字符,存储为字符串。这个字符串本身没有问题。红色下划线是我用来将此字符串存储在 bitset boost::dynamic_bitset 输出中的行。然后,我打印输出位集的前 6000 个字符,它们完全不同。我应该注意,“输出”位集作为参考参数传递给这个函数,但最初是空的。 输出

4

1 回答 1

1

根据文档std::string构造函数boost::dynamic_bitset会将输入的最后一个字符分配给最低有效位,即带有 index 的位0

在索引不断增长的循环中读回它会以相反的顺序给出原始字符串。

迭代器的构造函数会做一些完全不同的事情。他们将每个字符解释为一个整数(字符代码),并将每个整数的二进制表示保存到位集中。

考虑到,例如流输出运算符 fordynamic_bitset将从最高有效位开始打印位集,我认为以这种方式存储它没有问题。如果您使用循环,请务必考虑它。但是应该避免这样的循环,因为单个位访问将比同时处理整个存储块要慢。unsigned char出于同样的原因,可能建议使用本机块大小而不是。

如果您确实需要以其他顺序存储,请先反转您的字符串:

std::reverse(compressed.begin(), compressed.end());
于 2018-12-02T22:54:12.920 回答