Schreiben von binären Dateien in QT und Lesen Sie in matlab
Versuchen zu tun, die einfachste Sache überhaupt. Schreiben Sie eine Zahl in QT im Binär-Modus (unsigned 16) und Lesen Sie die Datei in matlab. Ich verwende Append-Modus, da ich werden das hinzufügen von zahlen, um die Datei in der Zukunft, Aber kann nicht scheinen, um dieses Recht zu.
Dies ist die QT-code:
QFile f("C:\\temp.dat");
f.open(QIODevice::WriteOnly | QIODevice::Append)
QDataStream out(&f);
out<<quint16(270);
f.close();
- Und dies ist der Matlab-code:
fid = fopen('C:\\temp.dat');
F_nums = fread(fid,1,'*uint16');
fclose(fid);
Scheint sehr einfach, aber es liest die zahlen falsch...
Danke!
- Falsch ist ein bisschen vage. Haben Sie schaute auf die Datei mit einem hex-editor? Stellen Sie zunächst sicher, dass die richtigen Werte in der Datei gespeichert werden. Wenn dies funktioniert, starten Sie das Debuggen von Matlab code.
- Ausgabe: 3585, anstelle von: 270
- Dies ist nicht hilfreich, was die Ausgabe ist, dass die Ausgänge? Wieder, überprüfen Sie die Dateien zuerst den Inhalt...
- Bytes sind vertauscht. 3585=0xE01, 270=0x10E
- Die Inhalte der Dateien korrekt sind, für die Anzahl von bis zu 255. Danach ist es Ihnen zeigen, zu Unrecht. Roku, du hast Recht! Danke! Keine Ahnung warum QT macht das schon?
- QDataStream Standard-byte-Reihenfolge, nur ist big-endian. Sie können es ändern, indem setByteOrder()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist sehr einfach: Sie schreiben von "big-endian" - Daten (MSB kommt zuerst), aber Matlab standardmäßig erwartet little-endian-Daten. Die Lösung ist einfach:
QDataStream
ist nicht wirklich bedeutete, um streams zu erstellen, sind portabel zwischen verschiedenen Anwendungen. (Es soll portabel sein unterschiedliche OS und Qt-Versionen, aber immer verbraucht, die von Qt.) Das format ist nicht garantiert stabil zu sein, so könnte es klappen heute, aber morgen brechen. Aus den docs:Wenn Sie Daten austauschen wollen, verwenden Sie ein Ausgabeformat, das ist bestimmt für die gemeinsame Nutzung, wie XML, Json, oder, in einem einfachen Fall wie diesem, schreiben Sie einfach die Nummer einer ANSI-Zeichenfolge in eine text-Datei. Ersetzen Sie einfach
QTextStream
fürQDataStream
.QDataStream
hat immer direkten Codierung von integer-und floating-point-Werte, und es ist der Weg Zugriff auf binary-format-Daten in einem tragbaren Mode. Die poster einfach nicht wählen Sie die richtigen endianness für die Datei. Die "Weiterentwicklung" Binär-format " bezieht sich darauf, wie Qt-eigenen Datenstrukturen werden codiert. Ganze zahlen sind ziemlich sicher auch so bleiben, wie Sie sind, es würde nicht viel Sinn sonst. E. g.: Ich benutze QDataStream zu Mobil Lesen big-endian-32-bit-floats kommen in über das Netzwerk.