首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt数据报构造结果:混合序列

Qt数据报构造结果:混合序列
EN

Stack Overflow用户
提问于 2013-07-10 04:39:51
回答 1查看 316关注 0票数 0

我从套接字读取数据,并将接收到的数据从数据报放到HostMessage。但是,当我试图显示HostMessage->MessageHeader时,它会显示无效数据。另外,根据wireshark的输出,数据报的输出看起来有点不同。

我用ntonl函数修正了这个问题(并且应用在MessageHeader上,而不是所有的数据报!),b是正确的结果。使用这个解决方案,我必须将ntonl应用于所有的struct成员,而我的成员超过100个。

你有什么解决办法或想法来解决这个问题吗?

代码:

代码语言:javascript
复制
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])
}

我的结构:

代码语言:javascript
复制
typedef struct tagHostMessage{
    unsigned int        MessageHeader[4];
    TMessageData MessageData;
    short int    CheckSum;

}THostMessage,*PHostMessage;

Wireshark输出(1024字节):

代码语言:javascript
复制
0d:cc:97:e0:00:00:00:00:00:00:00:00:00:....

qDebug输出:

代码语言:javascript
复制
datagram: d-ffffffcc-ffffff97-ffffffe0

msg header:  3768044557 = 0x9be9b8 

a = e097cc0d    
b = 0dcc97e0 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-10 08:40:49

似乎您正在经历字节顺序问题。由于QUdpSocket继承了QIODevice,所以可以在其上使用QDataStream,并且这个类支持字节顺序转换。指定传入数据的字节顺序:

代码语言:javascript
复制
QDataStream stream(m_udpSocket);
stream.setByteOrder(QDataStream::BigEndian); // or LittleEndian

然后你就可以接收到这样的数据:

代码语言:javascript
复制
unsigned int b;
stream >> b;

此外,qToBigEndianqToLittleEndianqFromBigEndianqFromLittleEndian函数也可能有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17562541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档