2016-11-28 214 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