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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QBitArray есть вопрос?  (Прочитано 14500 раз)
zoro86
Гость
« : Март 13, 2010, 08:37 »

Есть более простой способ как загнать HEX код типа 09 или 4B в QBitArray?
картина такова что мне в ответ устройстово выдает один байт, надо перевести в биты и прочесть каждый на различные статусы... соответственно после перевода должно получится 8 бит Непонимающий
Записан
SABROG
Гость
« Ответ #1 : Март 13, 2010, 10:04 »

Самый быстрый способ это static_cast из QByteArray в QBitArray. К сожалению об этом не пишут в документации и возможно в будущем могут появится дополнительные члены в QBitArray классе.
Записан
zoro86
Гость
« Ответ #2 : Март 13, 2010, 12:53 »

SABROG попробовал сделать так QBitArray *bitArray = static_cast<QByteArray *> (&baTmp);
выдает ошибку при компиляции и пишет...
cannot convert 'QByteArray*' to 'QBitArray*' in initialization
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Март 13, 2010, 13:30 »

zoro86, static_cast из QByteArray в QBitArray это:
Код
C++ (Qt)
...
QByteArray *byteArray;
...
QBitArray *bitArray = static_cast<QBitArray *> (byteArray);
...
 
Записан
zoro86
Гость
« Ответ #4 : Март 13, 2010, 14:34 »

такая же ошибка Непонимающий
Записан
BRE
Гость
« Ответ #5 : Март 13, 2010, 15:24 »

такая же ошибка Непонимающий
Так и должно быть.
static_cast<Type>( val ) это совсем не аналог сишного (Type)val.
Есть определенные правила работы static_cast и в эти правила не входит преобразование из QByteArray в QBitArray.
Почитай про static_cast побольше.  Подмигивающий
Записан
denka
Гость
« Ответ #6 : Март 13, 2010, 16:40 »

Есть более простой способ как загнать HEX код типа 09 или 4B в QBitArray?
картина такова что мне в ответ устройстово выдает один байт, надо перевести в биты и прочесть каждый на различные статусы... соответственно после перевода должно получится 8 бит Непонимающий
А возможностей самого языка разве для этого мало? Зачем тут огород из классов?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 13, 2010, 17:09 »

Почитай про static_cast побольше.  Подмигивающий
Почитай что/где? Стандарт? Там не так уж легко разобраться  Улыбающийся
Вот напр. доступное изложение http://alenacpp.blogspot.com/2005/08/c.html
Цитировать
static_cast между указателями корректно, только если один из указателей - это указатель на void или если это приведение между объектами классов, где один класс является наследником другого.
Привести через указатель - вероятно будет все Ok, по данным оба выглядят одинаково. Но это нелегальщина. Я бы вообще обошелся без QBitAtay, сделав пару-тройку ф-ций
Код:
inline bool GetBit( const QByteArray & a, int bitIndex )
{
 return a[bitIndex / 8] & (1 << (bitIndex % 8)) != 0;
}

inline void SetBit( QByteArray & a, int bitIndex )
{
 a[bitIndex / 8]  |= (1 << (bitIndex % 8));
}

inline void ClrBit( QByteArray & a, int bitIndex )
{
 a[bitIndex / 8]  &= ~(1 << (bitIndex % 8));
}

inline void SetBit( QByteArray & a, int bitIndex, bool doSet )
{
 if (doSet) SetBit(a, bitIndex);
 else ClrBit(a, bitIndex);
}
Записан
BRE
Гость
« Ответ #8 : Март 13, 2010, 17:48 »

Почитай что/где? Стандарт? Там не так уж легко разобраться  Улыбающийся
Почему стандарт? Не обязательно стандарт, но можно и его....
А так есть книги, статьи и куча заметок в инете.
Достаточно в google набрать это слово.

Вот напр. доступное изложение http://alenacpp.blogspot.com/2005/08/c.html
Вот-вот.  Подмигивающий

Я бы вообще обошелся без QBitAtay, сделав пару-тройку ф-ций
или посмотреть на QFlags.
« Последнее редактирование: Март 13, 2010, 18:02 от BRE » Записан
SABROG
Гость
« Ответ #9 : Март 14, 2010, 04:27 »

Если глянуть исходники, то там еще публичный указатель есть на QByteArray. Можно вообще без приведения типов работать. static_cast не работает скорее всего потому, что QBitArray не наследует QByteArray, а использует аггрегацию. Тогда наверно все-таки reinterpret_cast.
Записан
zoro86
Гость
« Ответ #10 : Март 15, 2010, 07:49 »

ну в общем поюзал там и тут получилась так..

void AV268Acceptor::dec_to_bin(const int decimal)
{
    int remainder;

            if(decimal <= 1) {
                result_bits[count_bit] = decimal;
                count_bit --;
                return;
            }

            remainder = decimal%2;
            result_bits[count_bit] = remainder;
            count_bit --;
            dec_to_bin(decimal >> 1);
            return;
}
void  AV268Acceptor::bits(const int decimal)
{

    count_bit = 7;

    dec_to_bin(decimal);
    qDebug() << result_bits[0];
    qDebug() << result_bits[1];
    qDebug() << result_bits[2];
    qDebug() << result_bits[3];
    qDebug() << result_bits[4];
    qDebug() << result_bits[5];
    qDebug() << result_bits[6];
    qDebug() << result_bits[7];

}
{
    ...
    unsigned char ff = 0x1B;
    int aa = ff;
    bits(aa);
   ...
}
где int count_bit;  QBitArray result_bits; public переменные...
если есть идеи как можно по другому, к примеру проста считать 3-bit из byta=0x1B пишите...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Март 15, 2010, 08:56 »

А не проще ли маскированием выделять нужные биты нежели юзать бит-аррай ? Улыбающийся
И причем тут hex код?
Записан

ArchLinux x86_64 / Win10 64 bit
p166
Гость
« Ответ #12 : Март 15, 2010, 22:06 »

Ребята! Юзайте битовые маски! Зачем велосипед изобретать? Столько кода лишнего.... жесть...
Записан
zoro86
Гость
« Ответ #13 : Март 16, 2010, 06:29 »

Скинте пример... или сылку, я таким еще не пользовался..
Записан
voronElf
Гость
« Ответ #14 : Март 16, 2010, 10:07 »

Например:
Код:
#define MASK_1 0x02
char bytes = .... //получение байта
if(bytes & MASK_1) {
  ... //первый бит установлен в 1 (нумерация битов с нуля начинается справал налево)
};

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


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