QTCP and packet parsing
Unsolved
General and Desktop
-
i do a checksum on the packet size and of that of the header. if the data matches to what it should be i parse it..
any sugguestions how to fix my issue?
@Jonnybravo Why do you want to use QVector for your buffer instead of QByteArray?
-
Could you tell me what im doing wrong here.. (qbyte array to qvector)
So ive created a class that gets data from a struct vector buffer
struct Packet { public: QVector<quint8>Buffer; quint8 Header; quint8 OpCode; public: Packet( ) {} Packet( int size ) : Buffer(size){ } /* Read values from packet */ template <typename T> T Get( quint32 pos ) { if( Buffer.size() < pos+sizeof(T) ) return 0; return *((T*)&Buffer[pos]); } quint8 GetByte( quint32 pos ) { return Get<quint8>( pos ); } quint16 GetWord( quint32 pos ) { return Get<quint16>( pos ); } unsigned GetDWord( quint32 pos ) { return Get<unsigned>( pos ); } quint64 GetQWord( quint32 pos ) { return Get<quint64>( pos ); } float GetFloat( quint32 pos ) { return Get<float>( pos ); } void GetString( quint32 pos, char* buffer ) { unsigned strLen = GetDWord( pos ); for(unsigned i = 0; i < strLen; i++ ) { buffer[i] = Get<quint8>(pos+4+i); } buffer[strLen] = 0; } };
So i am now trying to convert the data from qbyte to vector.
// Recv the entire buffer from bytesAvailable() recvbuffer = socket->readAll(); Packet m_pak(recvbuffer.size()); QDataStream out(&recvbuffer ,QIODevice::WriteOnly); out << m_pak.Buffer; //doesnt fill the buffer with the qbytearray..
Now should i just instead of using datastream just resize it and insert the qbytearray into the vector.
recvbuffer = socket->readAll(); Packet m_pak(MAX_BUFFER); m_pak.Buffer.resize(m_pak.Buffer.size() + recvbuffer.size()); memcpy(&m_pak.Buffer[m_pak.Buffer.size() - recvbuffer.size()], &recvbuffer[0], recvbuffer.size() * sizeof(int));
doesnt work..
recvbuffer = socket->readAll(); Packet m_pak(MAX_BUFFER); m_pak.Buffer.reserve(m_pak.Buffer.size() + recvbuffer.size()); qCopy(&recvbuffer[0], &recvbuffer[recvbuffer.size()], std::back_inserter(m_pak.Buffer)); //crashes due to the inserter copy.
Any ideas in how to fix this or what i should do...
I don't quite get why you're doing this, but this, should work:
m_pak.Buffer.clear(); for(int i(0); i < recvbuffer .size(); i++) m_pak.Buffer.append(static_cast<int>(recvbuffer.at(i));)
I'm not sure if you'll need the cast, but I added it, just to be sure ;-)