QDataStream // Socketverbindungen

Alles rund um die Programmierung mit Qt
Antworten
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

QDataStream // Socketverbindungen

Beitrag von flownfluid »

Hallo zusammen:

ich habe eine Datenklasse die ich serialisiere und dann über socketverbindung sende und dannach wieder deserialisiere...

Auf der Empfängerseite bei der read methode hab ich ein Problem:
Wie kann ich aus einem QDataStream X*Bytes rauslesen und diese in ein QByteArray abspeichern?

Habe mit folgendem probiert:

Code: Alles auswählen

QByteArray o_datas;
m_Datastream .readBytes(o_datas.data(),lenght);
Doch das funktioniert irgendwie nicht, respektive der Kompiler hat mit dem ein Problem. Jemand eine Idee?

Danke Matthias


Falls das von wichtigkeit ist wege von serialisierung -> senden -> empfangen :

Datenklasse (die serialisierungs und deserialisierungs methoden):

Code: Alles auswählen

QByteArray TransferPacket::getTransmitDatas()
{
  QByteArray block;
  QDataStream out(&block, QIODevice::WriteOnly);
  out.setVersion(QDataStream::Qt_4_5);

  out << m_Length  //int;
  out << m_ID        //int;
  out << m_Datas   //QByteArray;

  out.device()->seek(0);

  m_Length = (UInt32)(block.size() - sizeof(m_Length));
  out << m_Length;

  return  block;
}


void TransferPacket::setReceivedData(QByteArray ao_bytes)
{
  QDataStream in(&ao_bytes, QIODevice::ReadOnly);
  in.setVersion(QDataStream::Qt_4_5);

  in >> m_Length   //int;
  in >> m_ID         //int;
  in >> m_Datas    //QByteArray;
}

meine sende methode:

Code: Alles auswählen

  QByteArray block;
  QDataStream out(&block, QIODevice::WriteOnly);
  out.setVersion(QDataStream::Qt_4_5);

  out << (quint16)0;

  foreach(Transportpacket o_packet, list)
  {
    QByteArray o_packetData = o_packet.getTransmitDatas();
    out << (quint16)o_packetData.length();
    out << o_packetData;
  }

  out.device()->seek(0);
  out << (quint16)(block.size() - sizeof(quint16));

  //write to the client
  op_tcpSocket->write(block);
  op_tcpSocket->flush();
Bis hierhin klappt alles ausgezeichnet. Mein Problem fängt auf der Empfängerseite an und zwar folgendes:

Emfangsmethode:

Code: Alles auswählen

  QByteArray l_ReceivedBlock = readAll();

  QDataStream   l_DataStream(&l_ReceivedBlock, QIODevice::ReadOnly);
  l_DataStream.setVersion(QDataStream::Qt_4_5);

  quint 16 length;
  l_DataStream>> length;

  //ab hier wird der code noch in einer schlaufe gelegt...
  int i_lengthDataPacket = 0;
  l_DataStream >> i_lengthDataPacket;
  QByteArray o_datasForPacket;
  //mein problem hier : wie kann ich nun aus dem Datastream
  //i_lenghtDataPackt Bytes rauslesen und zugleich aus dem Stream 
  //nehmen...?!?!
  
flownfluid
Beiträge: 80
Registriert: 6. Januar 2005 12:54

Beitrag von flownfluid »

Keine Ahnung was ich hatte :-(. Ist wohl der Montageffekt:

nun gelöst mit :

Code: Alles auswählen

    char* dataBytes;
      l_DataStream >> dataBytes;
      QByteArray o = QByteArray(dataBytes , length);
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nicht vergessen:
QDataStream & QDataStream::operator>> ( char *& s )
Space for the string is allocated using new -- the caller must destroy it with delete[].
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten