Russian Qt Forum
Сентябрь 30, 2024, 08:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QBitArray в QByteArray  (Прочитано 3618 раз)
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" получился.
Массив битов не меняется. Я может что-то не понимаю в битовых и байтовых операциях? Если на калькуляторе переводить, то все верно. А программа выдает ересь. Заранее благодарен за помощь.
Записан
Fat-Zer
Гость
« Ответ #1 : Январь 12, 2015, 09:24 »

bytes.fill(0);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 12, 2015, 09:33 »

bytes.fill(0);
Может еще лучше так
Код
C++ (Qt)
QByteArray bytes((bits.size() + 7) / 8, 0);
 
Записан
vorotislav
Гость
« Ответ #3 : Январь 12, 2015, 09:46 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 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);
Записан
vorotislav
Гость
« Ответ #5 : Январь 12, 2015, 11:42 »

Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.