Qt датаграмма для структурирования результата: смешанная последовательность

Я читаю данные из сокета и помещаю полученные данные из дейтаграммы в HostMessage. но когда я пытаюсь показать HostMessage-> MessageHeader, он показывает неверные данные. также вывод дейтаграмм выглядит немного иначе в зависимости от вывода wireshark.

Я исправил эту проблему с помощью функции ntonl (и применил к MessageHeader, а не ко всем дейтаграммам !!), b — правильный результат. с этим решением, я должен применить ntonl ко всем членам структуры, и у меня есть члены более 100.

Есть ли у вас какое-либо решение или идея, чтобы это исправить?

Код:

unsigned int ntonl(unsigned int a){
unsigned int b;
char* pA = (char*)&a;
char* pB = (char*)&b;

for (int i = 0; i < sizeof(pA); i++){
pB[i] = pA[(sizeof(pA)-1) - i];
}

return b;
}

void myDevice::processPendingDatagrams(){
while (m_udpSocket->hasPendingDatagrams()){
QByteArray datagram;
datagram.resize(m_udpSocket->pendingDatagramSize());

QHostAddress sender;
quint16 senderPort;

qint64 dataReceivedLength = m_udpSocket->readDatagram(datagram.data(),
datagram.size(),
&sender,
&senderPort);

tagHostMessage* HostMessage = (tagHostMessage*)datagram.data();

qDebug("datagram: %x-%x-%x-%x", datagram.data()[0], datagram.data()[1], datagram.data()[2], datagram.data()[3]);
qDebug()<<"msg header: " << HostMessage->MessageHeader[0] << "=" << HostMessage->MessageHeader;

b = ntonl(HostMessage->MessageHeader[0])
}

моя структура:

typedef struct tagHostMessage{
unsigned int        MessageHeader[4];
TMessageData MessageData;
short int    CheckSum;

}THostMessage,*PHostMessage;

Выход Wireshark (1024 байта):

0d:cc:97:e0:00:00:00:00:00:00:00:00:00:....

Выводы qDebug:

datagram: d-ffffffcc-ffffff97-ffffffe0

msg header:  3768044557 = 0x9be9b8

a = e097cc0d
b = 0dcc97e0

0

Решение

Кажется, у вас проблема с порядком байтов. поскольку QUdpSocket наследуется QIODevice, ты можешь использовать QDataStream на нем, и этот класс поддерживает преобразование порядка байтов. Укажите порядок байтов входящих данных:

QDataStream stream(m_udpSocket);
stream.setByteOrder(QDataStream::BigEndian); // or LittleEndian

И тогда вы можете получить такие данные:

unsigned int b;
stream >> b;

Также qToBigEndian, qToLittleEndian, qFromBigEndian, qFromLittleEndian функции могут быть полезны.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]