1

此功能对于某些输入无法正常工作,那么错误是什么?

所有项目代码在这里:链接

ps:我正在使用“bits.size()%8”等于零的输入

QByteArray bitsToBytes(QBitArray bits) {
  QByteArray bytes;
  bytes.resize(bits.count()/8);

  // Convert from QBitArray to QByteArray
  for(int b=0; b<bits.count(); ++b)
    bytes[b/8] = ( bytes.at(b/8) | ((bits[b]?1:0)<<(b%8)));

  return bytes;
}
4

3 回答 3

1

我认为这可能是位应左(7 - (b % 8))移位

我尝试了这个并得到了预期的结果。

QBitArray bits;
QByteArray bytes;

bits.resize(12);
bits.fill(true);

bits.setBit(2,false);

bytes.resize((bits.count() - 1) / 8 + 1);

for(int b=0; b<bits.count(); ++b)
    bytes[b/8] = ( bytes.at(b/8) | ((bits[b]?1:0)<<(7-(b%8))));

for (int b=0;b<bytes.size();b++)
    printf("%d\n",(quint8)bytes.at(b));
于 2012-01-05T10:28:42.587 回答
1

Topro 算法整体上应该是正确的。但是我的演唱会是带考的bits[b]?1:0

默认情况下,operator[] ( int i )返回“索引位置 i 处的位作为可修改的引用”,同时operator[] ( int i ) const返回一个布尔值。如果第一个定义被选中,您将测试引用是否为真。

尝试使用 Topro 算法bits.testBit(b)

于 2012-01-05T12:55:03.437 回答
0

考虑这种情况,其中 (bits.count() % 8) != 0 ,例如 9 然后bytes.resize(bits.count()/8);返回错误的结果。

正如 Topro 在评论中建议的那样,您可以使用bytes.resize((bits.count() - 1) / 8 + 1)).

于 2012-01-05T10:50:13.527 回答