此功能对某些输入无法正常工作,那么错误是什么?
此处所有项目代码: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;
}
答案 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))
。