Qt数据报结构结果:混合序列
Qt datagram to structure result: mixed sequence
我正在从套接字读取数据,并将接收到的数据从数据报放入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输出(1024byte):
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
您似乎遇到了字节顺序问题。由于QUdpSocket
继承了QIODevice
,因此可以在其上使用QDataStream
,并且此类支持字节顺序转换。指定传入数据的字节顺序:
QDataStream stream(m_udpSocket);
stream.setByteOrder(QDataStream::BigEndian); // or LittleEndian
然后你可以接收这样的数据:
unsigned int b;
stream >> b;
此外,qToBigEndian
、qToLittleEndian
、qFromBigEndian
、qFromLittleEndian
功能可能是有用的。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 混合组合和继承的C++问题
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 在混合代码库中将C转换为C++时出现许多包含错误
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- D3D11-将混合权重和索引传递到顶点着色器
- OpenCV 混合模式实现:为什么看似等效的操作会产生不同的结果?
- 混合托管C++方法并不总是向调用C#代码返回相同的结果
- Qt数据报结构结果:混合序列
- 混合推力和cuBLAS意想不到的结果输出