我不确定我是否理解QByteArray对象是如何工作的(它是原始的char数据,对吧?),但这是我的困境:
我正在尝试从函数中的UDP数据报访问数据。代码:
QByteArray buffer;
buffer.resize(udpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpSocket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
这释放了其他传入数据的缓冲区,并允许我处理当前的数据报。
据我所知,我必须将数据存储在QByteArray中,因为任何其他尝试都使编译器与我交叉。无论如何,存储在QByteArray中的数据是我需要访问的一系列无符号16位值(命令)。可以直接从QByteArray中读取,如果是,怎么样?我没有运气这样做。如果没有,将整个数组转换为quint16数组的最佳方法是什么,以便我可以处理传入的数据?谢谢大家!!
答案 0 :(得分:4)
使用readDatagram读取数据后,需要以quint16值访问它。
两种可能的方法:
使用quint16缓冲区并直接存储到其中:
//Set 1024 to any large enough size
QVector<quint16> buffer(1024);
qint64 readBytes = udpSocket->readDatagram((char*)buffer.data(),
buffer.size()*sizeof(qint16),
&sender,
&senderPort);
buffer.resize(readBytes/sizeof(quint16));
//Now buffer contains the read values, nothing more.
使用QByteArray并将其“反序列化”为quint16值。这种方法更复杂但更清晰,因为您可以选择解释数据格式,例如字节顺序。
//Set 2048 to any large enough size
QByteArray buffer(2048);
qint64 readBytes = udpSocket->readDatagram(buffer.data(),
buffer.size(),
&sender,
&senderPort);
buffer.resize(readBytes);
QDataStream dataStream(&buffer, QIODevice::ReadOnly);
//Configure QDataStream here, for instance:
//dataStream.setByteOrder(QDataStream::LittleEndian);
while(!dataStream.atEnd())
{
quint16 readValue;
dataStream >> readValue;
//do something with readValue here
}