Pensé que este problema debería ser identificado y resuelto por la comunidad, pero parece que estoy buscando con las palabras clave equivocadas o es realmente así de difícil de alcanzar.

El problema es simple. Quiero definir una estructura en la que se debe definir un contenedor de datos dinámicos (Vector, Lista, Cola, lo que funcione).

 #pragma pack(1)

 struct Example
 {
    int foo;

    QVector<int> bar;
 };

Necesito insertar valores enteros en este Vector (o tomar cualquier otro contenedor Qt / STL) y quiero copiar el contenido de esta estructura en una matriz de bytes para escribir sus datos sin procesar en un archivo.

Lo que encuentro es que cuando escribo el siguiente código:

Example exstr;
qDebug()<<sizeof(exstr);
exstr.bar.push_back(12);
exstr.bar.push_back(5);
qDebug()<<sizeof(exstr);

Muestra los valores:

8
8

Ahora, esto se debe probablemente a que QVector es solo un puntero ordinario que apunta a los datos contiguos, pero lo que necesito es un contenedor de datos redimensionable dinámicamente (que también redimensionaría la estructura en la que se encuentra) y me permitiría usar el contenido byte por byte cuando intente serializarlo.

Gracias por la ayuda de antemano.

0
Doğukan Tunç 14 dic. 2016 a las 15:56

2 respuestas

La mejor respuesta

QDataStream le permite serializar algunos de los tipos de datos de Qt: Serializar tipos de datos de Qt

QDataStream stream(&file);   // we will serialize the data into the file
stream << your_qvector_obj;
//...
QVector<int> new_vec;
stream >> new_vec;
//...
1
Vladimir Bershov 14 dic. 2016 a las 13:03

Estás en el camino correcto con QVector. La clase de vector STL también funcionará. Se garantiza que ambas clases almacenarán sus valores en la memoria contigua.

Para QVector, necesita algo como esto:

memcpy (dest, bar.data(), bar.count () * sizeof (int));

Para un vector STL, toma la dirección del primer elemento:

memcpy (dest, &bar[0], bar.size () * sizeof (int));

En ambos casos, "dest" debe ser lo suficientemente grande para contener los datos que está copiando. Estoy usando la copia aquí como ejemplo; si solo necesita un puntero a los datos, QVector :: data proporciona que, para un vector STL, la dirección del primer elemento lo proporciona.

0
goug 14 dic. 2016 a las 19:12