Название: QBitArray есть вопрос? Отправлено: zoro86 от Март 13, 2010, 08:37 Есть более простой способ как загнать HEX код типа 09 или 4B в QBitArray?
картина такова что мне в ответ устройстово выдает один байт, надо перевести в биты и прочесть каждый на различные статусы... соответственно после перевода должно получится 8 бит ??? Название: Re: QBitArray есть вопрос? Отправлено: SABROG от Март 13, 2010, 10:04 Самый быстрый способ это static_cast из QByteArray в QBitArray. К сожалению об этом не пишут в документации и возможно в будущем могут появится дополнительные члены в QBitArray классе.
Название: Re: QBitArray есть вопрос? Отправлено: zoro86 от Март 13, 2010, 12:53 SABROG попробовал сделать так QBitArray *bitArray = static_cast<QByteArray *> (&baTmp);
выдает ошибку при компиляции и пишет... cannot convert 'QByteArray*' to 'QBitArray*' in initialization Название: Re: QBitArray есть вопрос? Отправлено: MoPDoBoPoT от Март 13, 2010, 13:30 zoro86, static_cast из QByteArray в QBitArray это:
Код
Название: Re: QBitArray есть вопрос? Отправлено: zoro86 от Март 13, 2010, 14:34 такая же ошибка ???
Название: Re: QBitArray есть вопрос? Отправлено: BRE от Март 13, 2010, 15:24 такая же ошибка ??? Так и должно быть.static_cast<Type>( val ) это совсем не аналог сишного (Type)val. Есть определенные правила работы static_cast и в эти правила не входит преобразование из QByteArray в QBitArray. Почитай про static_cast побольше. ;) Название: Re: QBitArray есть вопрос? Отправлено: denka от Март 13, 2010, 16:40 Есть более простой способ как загнать HEX код типа 09 или 4B в QBitArray? А возможностей самого языка разве для этого мало? Зачем тут огород из классов?картина такова что мне в ответ устройстово выдает один байт, надо перевести в биты и прочесть каждый на различные статусы... соответственно после перевода должно получится 8 бит ??? Название: Re: QBitArray есть вопрос? Отправлено: Igors от Март 13, 2010, 17:09 Почитай про static_cast побольше. ;) Почитай что/где? Стандарт? Там не так уж легко разобраться :)Вот напр. доступное изложение http://alenacpp.blogspot.com/2005/08/c.html (http://alenacpp.blogspot.com/2005/08/c.html) Цитировать static_cast между указателями корректно, только если один из указателей - это указатель на void или если это приведение между объектами классов, где один класс является наследником другого. Привести через указатель - вероятно будет все Ok, по данным оба выглядят одинаково. Но это нелегальщина. Я бы вообще обошелся без QBitAtay, сделав пару-тройку ф-цийКод: inline bool GetBit( const QByteArray & a, int bitIndex ) Название: Re: QBitArray есть вопрос? Отправлено: BRE от Март 13, 2010, 17:48 Почитай что/где? Стандарт? Там не так уж легко разобраться :) Почему стандарт? Не обязательно стандарт, но можно и его....А так есть книги, статьи и куча заметок в инете. Достаточно в google набрать это слово. Вот напр. доступное изложение http://alenacpp.blogspot.com/2005/08/c.html (http://alenacpp.blogspot.com/2005/08/c.html) Вот-вот. ;)Я бы вообще обошелся без QBitAtay, сделав пару-тройку ф-ций или посмотреть на QFlags.Название: Re: QBitArray есть вопрос? Отправлено: SABROG от Март 14, 2010, 04:27 Если глянуть исходники, то там еще публичный указатель есть на QByteArray. Можно вообще без приведения типов работать. static_cast не работает скорее всего потому, что QBitArray не наследует QByteArray, а использует аггрегацию. Тогда наверно все-таки reinterpret_cast.
Название: Re: QBitArray есть вопрос? Отправлено: zoro86 от Март 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 пишите... Название: Re: QBitArray есть вопрос? Отправлено: kuzulis от Март 15, 2010, 08:56 А не проще ли маскированием выделять нужные биты нежели юзать бит-аррай ? :)
И причем тут hex код? Название: Re: QBitArray есть вопрос? Отправлено: p166 от Март 15, 2010, 22:06 Ребята! Юзайте битовые маски! Зачем велосипед изобретать? Столько кода лишнего.... жесть...
Название: Re: QBitArray есть вопрос? Отправлено: zoro86 от Март 16, 2010, 06:29 Скинте пример... или сылку, я таким еще не пользовался..
Название: Re: QBitArray есть вопрос? Отправлено: voronElf от Март 16, 2010, 10:07 Например:
Код: #define MASK_1 0x02 Почитай про битовые операции в С Название: Re: QBitArray есть вопрос? Отправлено: sne от Март 17, 2010, 10:57 Код: #ifndef BITARRAYEXT_H Код: #include "bitarrayext.h" Может быть кому пригодится. Название: Re: QBitArray есть вопрос? Отправлено: p166 от Март 18, 2010, 15:19 Вот два примера по использованию битовых масок.
1 - getRights() - возвращает ulong где первые 8 бит являются флагами 2 - setRights(ulong rights) - читает 8 бит ulong и вывешивает соответствующие флаги. Для наглядности работа функций реализована немного по разному. Код: ulong WFIL_req::getRights() Название: Re: QBitArray есть вопрос? Отправлено: voronElf от Март 19, 2010, 07:16 p166, не сочтите за наезд, но не проще ли вместо маски в 0х01 везде прописать константы с нужным битом (0х01, 0x02, 0x04 ...) ?
нагляднее и на операциях сдвига экономия ... Код: rights |= 0x01; Название: Re: QBitArray есть вопрос? Отправлено: p166 от Март 19, 2010, 14:14 voronElf, полностью согласен с тобой, но как я писал выше:
Цитировать Для наглядности работа функций реализована немного по разному. Это удобно если читаешь биты в цикле, выглядит нагляднее и на :) Код: for (int i=0; i<sizeof(ulong)*8; i++) PS2: поправился :) Название: Re: QBitArray есть вопрос? Отправлено: voronElf от Март 19, 2010, 14:27 в цикле да, согласен
ПС: sizeof(ulong) возвращает количество битов ? не знал .... |