2016-11-28 216 views
0

我必須從TCP套接字接收數據。它有固定的16個字節的標題(一個標題的字段是數據長度)和數據。我用BigEndian收到它,但它是用LittleEndian發送的。從TCP套接字讀取

我可以找到這樣的數據接收良好的解決方案。現在什麼工作對我來說(讀頭字段之一):

QByteArray packetType = tcpSocket->read(2); 
QDataStream in(packetType); 
in.setByteOrder(QDataStream::LittleEndian); 
quint16 pT = 0; 
in >> pT; 

有沒有更好的方式來設置的QByteArray字節序? 或者用QDataStream讀取指定字節數的方法?

+1

您對您寫的代碼有什麼不喜歡的? –

+0

修復源碼!它不應該被髮送作爲小端第一位。 – Arunmu

+0

@DaleWilson我相信有「少線」的解決方案。 – bLAZ

回答

1

你幾乎做得對。中間體QByteArray是不必要的。您可以直接在套接字上設置數據流:

QTcpSocket socket; 
QDataStream in(&socket); 
in.setByteOrder(QDataStream::LittleEndian); 
... 
void onReadyRead() { 
    in.startTransaction(); 
    uint16_t packet_type; 
    in >> packet_type; 
    if (in.status == QDataStream::Ok) { 
    if (packet_type == Foo) { 
     uint32_t foo_data; 
     in >> foo_data; 
     if (! in.commitTransaction()) 
     return; // not enough data 
     // got a full packet here 
    } 
    } 
    in.abortTransaction(); 
} 
+0

你能幫忙嗎?完整標題如下: 'uint64_t headerID; uint16_t packetType; uint16_t length; uint16_t arg1; uint16_t ARG2;' 我試圖來閱讀: '在>> >> headerID >> packetType長度>> >>的arg1 arg2的;' 但它是不可能的,由於上uint64_t中可變>>操作。 – bLAZ

+0

你需要自己實現那個操作符,然後:)看看Qt如何實現它們並做更多相同的事情。 –

+0

好的,我發現Qt已經爲'quint64'定義了:)但是在頭部之後,我有2140字節長度的數據。它的一部分是整數,一部分是字符串。我現在閱讀它:'char * temp = new char [length]; in.readRawData(temp,length)',但不知道如何將它分割爲單獨的變量,從某種意義上說,如何將char錶轉換爲整數和字符串。 – bLAZ