我有一个代表 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 个字符,它们完全不同。我应该注意,“输出”位集作为参考参数传递给这个函数,但最初是空的。