将QBitArray转换为QByteArray

时间:2012-01-05 10:16:16

标签: c++ qt qbytearray

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

此处所有项目代码:link

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;
}

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

Topro算法整体上应该是正确的。但是我的音乐会正在进行测试bits[b]?1:0

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

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

答案 2 :(得分:0)

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

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