Cześć!
Wczytuję pewien plik(XX), który posiada bloki danych które poprzedzone są 4 literową nazwą(Tag) oraz 32bitową liczbą opisującą rozmiar bloku.
Przedstawiam poniżej dość uproszczony fragment:
#include <QDataStream>
#include <QMap>
#include <QFile>
// klasa pomocnicza do wczytania 4-literowego znacznika
class QXXTag: public QByteArray
{
public:
explicit QXXTag() : QByteArray(4, 0){}
friend QDataStream& operator>> (QDataStream& stream, QXXTag& tag){
int size;
size = stream.readRawData(tag.data(), tag.size());
if(size != tag.size())
stream.setStatus(QDataStream::ReadCorruptData);
return stream;
}
};
int main(){
QFile file("test.xx");
if(!file.open(QFile::ReadOnly)){
return -1;
}
QDataStream stream(&file);
QMap<QString, QByteArray> map;
// wczytanie pliku do mapy
QXXTag tag;
qint32 size;
while((stream >> tag >> size).status() == QDataStream::Ok){ // wczytanie 4literowego tag'a oraz rozmiaru
QByteArray data(size, 0); // ustawienie tablicy na rozmiar `size`
stream.readRawData(data.data(), data.size()); // wczytanie `size` bajtow do tablicy
map.insert(tag, data); // wpisanie do mapy w postaci `tag` `data`
}
// hmmm
return 0;
}
Problemem jest teraz interpretacja danych w QByteArray
które znajdują się w QMap
QMap<QString, QByteArray> map;
String w QMap(czyli tag) oznacza w jakiej formie dane mogą być odczytane.
Danymi są tablice(nie zawsze) struktur z polami typu short, int, char[20] itp.
np.
struct xx_tag_kphr{
char presetName[20]; // po wczytaniu, trzeba będzie przerobić na QByteArray lub QString'a. presetName może nie zawierać \0 na końcu tekstu
uint16_t preset;
uint16_t bank;
uint32_t library;
};
Jeżeli tag ma wartość "kphr" to QByteArray
może ważyć N*sizeof(struct xx_tag_kphr)
.
Gdzie N to ilość takich struktur.
Brakuje mi pomysłu jak to ugryźć, czy przy wczytywaniu pliku od razu parsować dane, zamiast QByteArray
zrobić jakiegoś varianta, czy jak?
Porobić templaty na QByteArray
? Może klasy które w konstruktorze przyjmują QByteArray?
Fajnie gdyby można było iterować w foreach'u jeśli jest kilka struktur.
Siedzę pół dnia bez nawet nowej literki wpisanej w kodzie i tak dumam, jak to dobrze napisać :(