Как принимать и разбирать по UDP QByteArray в структуру из битовых полей?
Есть 2 структуры битовых полей объединенные в одну структуру. Раньше, когда общий размер структуры позволял, делал объединение через union в uint64. Сейчас размер структур стал больше, передаю в QByteArray с сервера клиенту и теперь появилась проблема с приемом и разбором.
Как правильно это делают нормальные люди? можно еще с примером, буду рад!
Ответы (2 шт):
Например, вот так оформляю структуру:
PACKED_START
struct armos_header_t
{
unsigned short cmd :14;
unsigned short message_type :1;
unsigned short need_ans :1;
unsigned short length :16;
unsigned short sender_id :16;
unsigned char error :8;
unsigned char version :8;
unsigned short receiver_id :16;
unsigned short counter :16;
};
PACKED_END
где
# define PACKED_START _Pragma("pack(push, 1)")
# define PACKED_END _Pragma("pack(pop)")
а потом в полученном по сети сообщении нахожу место начала данных для структуры, и с помощью memcpy копирую в структуру количество байт, равное ее размеру.
Для начала нужно подключить сетевое API в .pro файл проекта, делается следующим образом.
QT += network
и сразу подключим библиотеку к проекту
#include <QUdpSocket>
Начнем с передачи. Где-то в классе вы создаете новый сокет.
QUdpSocket *socket = new QUdpSocket();
Создаем в классе структуру в которое будем класть сообщение.
Структура:
#pragma pack(push, 1) // работает без директив
struct srt_t // размер структуры 160 бит или 20 байт
{
uint8_t one;
uint8_t two;
uint16_t three;
uint32_t four;
uint64_t five;
uint32_t six: 16,
seven: 16;
};
#pragma pack(pop)
Далее вы конвертируете битовое поле в QByteArray следующим образом.
srt_t ht{ 255, 255, 65535, 4294967295, 9223372036854775807, 65535, 65535 };
QByteArray arr;
arr.append( reinterpret_cast<char *>( &ht ), sizeof( ht ) );
После кодирование битового поля в QByteArray можно и отправить наше сообщение, а на этом сайте можно увидеть более подробный пример, но лучше обратится к официальной документации по Qt.
socket->writeDatagram( arr , QHostAddress("127.0.0.1"), 1234 );
На этом с отправкой можно закончить. Приступим к чтению нашего сообщения, что бы наша программа приняла наше сообщение, нужно создать QObject::connect с сигналом на поступления в буфер данных.
Читаем и декодируем данные из буфера:
QByteArray buffer;
srt_t *ht = reinterpret_cast<srt_t *>(buffer.data());
Вот и все, данные положили в QByteArray и отправили по udp, а на другой приняли и декодировали обратно в битовое поле.