преобразование QBitArray в QByteArray - PullRequest
1 голос
/ 05 января 2012

Эта функция не работает правильно для некоторых входов, так в чем же ошибка?

Все коды проектов здесь: ссылка

пс: я использую ввод, который "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 ]

1 голос
/ 05 января 2012

Алгоритм Топро должен быть корректным в целом.Но мой концерт с тестом bits[b]?1:0.

. По умолчанию operator[] ( int i ) возвращает «бит в индексной позиции i в качестве модифицируемой ссылки», а operator[] ( int i ) const возвращает логическое значение.Если выбрано первое определение, вы проверите, верна ли ссылка.

Попробуйте алгоритм Topro с bits.testBit(b).

1 голос
/ 05 января 2012

я думаю, что, возможно, биты должны быть сдвинуты влево (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));
0 голосов
/ 05 января 2012

Рассмотрим случай, когда (bits.count ()% 8)! = 0, например, 9 Тогда bytes.resize(bits.count()/8); возвращает неправильный результат.

Как подсказал Топро в комментарии, вы можете использовать bytes.resize((bits.count() - 1) / 8 + 1)).

...