簡體   English   中英

從QByteArray訪問UDP數據報

[英]Access UDP Datagram from a QByteArray

我不確定我是否了解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數組以便處理傳入數據的最佳方法是什么? 謝謝大家!

使用readDatagram讀取數據后,需要以quint16值訪問它。

兩種可能的方法:

  1. 使用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. 
  2. 使用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 } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM