Russian Qt Forum

Qt => Вопросы новичков => Тема начата: vorotislav от Январь 12, 2015, 09:02



Название: QBitArray в QByteArray
Отправлено: vorotislav от Январь 12, 2015, 09:02
Доброго времени суток всем.
У меня есть функция, которая переводит массив битов в массив байтов:

Код:
QByteArray Packet::bitsToBytes(const QBitArray &bits)
{
    qDebug() << "Bits: " << bits;
    QByteArray bytes;
    bytes.resize(bits.size()/8);

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

    return bytes;
}

И мне надо два массива битов перевести.
Если массив Bits:  QBitArray(1110 0111) правильно переводит в byte2:  "e7"
То массив Bits:  QBitArray(1100 0000) не правильно. Причем ответ меняется. То это byte1:  "23", а бывает и byte1:  "3b". А мне надо чтоб "c0" получился.
Массив битов не меняется. Я может что-то не понимаю в битовых и байтовых операциях? Если на калькуляторе переводить, то все верно. А программа выдает ересь. Заранее благодарен за помощь.


Название: Re: QBitArray в QByteArray
Отправлено: Fat-Zer от Январь 12, 2015, 09:24
bytes.fill(0);


Название: Re: QBitArray в QByteArray
Отправлено: Igors от Январь 12, 2015, 09:33
bytes.fill(0);
Может еще лучше так
Код
C++ (Qt)
QByteArray bytes((bits.size() + 7) / 8, 0);
 


Название: Re: QBitArray в QByteArray
Отправлено: vorotislav от Январь 12, 2015, 09:46
Fat-Zer, Igors, спасибо! Ваши советы помогли сдвинуться с мертвой точки.
Оказывается всю последовательность битов он читал с конца. Получалось, что Bits:  QBitArray(1100 0000), в байты переделывал как 0000 0011. А со вторым массивом мне просто повезло, что он зеркальный.
В итоге пока это писал, понял где моя ошибка затаилась, и теперь все работает правильно.
А подскажите пожалуйста, вот у меня есть массив из двух байт "с0" и "е7". Т.к. это контрольная сумма, мне надо её сравнить с той, что я посчитал пока принимал пакет. Как мне этот массив в int переделать? Заранее благодарен!


Название: Re: QBitArray в QByteArray
Отправлено: Igors от Январь 12, 2015, 10:35
А подскажите пожалуйста, вот у меня есть массив из двух байт "с0" и "е7". Т.к. это контрольная сумма, мне надо её сравнить с той, что я посчитал пока принимал пакет. Как мне этот массив в int переделать?
Выходит данные приходят в big endian (первый байт старший). Получив 2 байта (b1 и b2) надо их переставить, напр
Код
C++ (Qt)
unsigned char b1, b2;  (c0, e7)
..
int code = b1 | (b2 << 8);


Название: Re: QBitArray в QByteArray
Отправлено: vorotislav от Январь 12, 2015, 11:42
Спасибо!