Bytes aus stream lesen
-
Hallo,
ich habe die Signatur einer Methode vorgegeben bekommen ->void myFoo(const char*, int*, int* );Das Ziel ist das Einlesen einer binären Datei, davon sollen 2 bytes gelesen werden und in die beiden int* gepackt werden
Mein Versuch sieht so aus
void myFoo(const char* datei, int* wert1, int* wert2){ ifstream file(datei,ios::in|ios::binary|ios::ate); file.seekg (0, ios::beg); char *c = new char[1]; // Ersten wert file.read(c, 1); // der muss nach wert1 (ist aber ein int*) *wert1 = (int)*c; // Zweiter wert file.read(c, 1); // der muss nach wert2 (ist aber ein int*) *wert2 = (int)*c; delete c; file.close(); }Dies klappt so nicht, irgendwie habe ich Probleme mit den Pointern
Ich kann in file.read nicht explizit wert1 einsetzen, oder?
file.read((char *)wert1, 1);ergibt bei mir auf jedenfall 0, wennich hier "c" beobachte, ist es 36, daher scheint der Cast in die hose zu gehen.
-
ifstream file(datei,ios::in|ios::binary); if (file.is_open()) { // Ersten wert file.read(reinterpret_cast<char*>(wert1), sizeof(*wert1)); // Zweiter wert file.read(reinterpret_cast<char*>(wert2), sizeof(*wert2)); file.close(); }
-
Hallo,
wenn ich 4 chars, also ein int lesen will und mit read(c,4); quasi ein c Array mit c,c+1,c+2 und c+3 als die vier bytes bekomme, wie bekomme ich diese denn in ein ganzes int?In der Datei sind die ersten vier Bytes : 00 00 02 57 (hex), was als int 599 ergibt
-
Hineinkopieren.
Aber versuchs doch so wie ich geschrieben habe, dann wird das nämlich direkt gemacht.
-
Hallo,
hab ich vergessen zu erwähnen, ich hab das natürlich so gemacht, es kommt nur 0 dabei raus.
(Die Datei wird aber geöffnet, bekomm nämlich die Größe der Datei mit ca 500000 Bytes)
-
Hallo nochmal,
ich hab versucht es so zu testen->file.seekg(0,ios::beg); int wert1 = -1; file.read(reinterpret_cast<char*>(&wert1), sizeof(wert1));Aber bei wert1 kommt leider 1459748864, was nicht ganz korrekt zu sein scheint.
Nun weiß ich nicht weiter
-
Doch, das ist korrekt:
Dezimal 1459748864 = Hex 57020000
Dies entspricht deinem File Inhalt (ersten 4 Bytes): 00 00 02 57
Du musst die Byte Order berücksichtigen (Big Endian, Little Endian).
Gruss Simon
-
Wie kompensiert man dieses Problem am besten? Das Array mit reverse umdrehen?
Ich bin mit einem Problem konfrontiert, ich habe eine Datei, die ich in der Hex-Ansicht so sehe, wie ich es beschrieben habe -> 00 00 02 57 usw. Auf meinem Intel wird aber in Little-Endian gespeichert, so dass die vier Bytes im Speicher als 57 02 00 00 abgelegt worden sind. Wo kann ich dann am besten die Daten richtig rumdrehen? ein reverse bei dem Array?Ferner muss ich danach noch 500.000 Bytes in ein Array packen, dieses müsste ich logischerweise dann auch noch mal drehen. Alles mit reverse?
Ich sehe das Problem auch hier ->
file.read(reinterpret_cast<char*>(&wert1), sizeof(wert1));,da kann ich ja eigentlich nicht wirklich ein reverse reinschieben, nicht wahr?
Edit, was mich verwirrt:
char * gg = new char [4]; file.read(gg, 4); cout << "gg "<< (int)gg[0] << " "<< (int)gg[1] << " "<< (int)gg[2] << " "<< (int)gg[3] << endl;Gib mir 0 0 2 87 aus, diese Repräsentation ist wiederum richtig?
-
Gib mir 0 0 2 87 aus, diese Repräsentation ist wiederum richtig?
Das sind die einzelnen Bytes, einfach dezimal ausgeben (57hex = 87dez).
Entweder schreibst Du eine eigene Konvertierung oder Du benutzt ntohl(..) und Verwandte. Diese Funktionen stammen aus dem Bereich der Netzwerkprogrammierung, da dort dieses Problem der Endianess auch auftritt.
Übrigens musst Du nicht alles umkehren. Es kommt halt drauf an wie es in die Datei reingeschrieben wurde. Wurde ein long (4 Btyes) reingeschrieben, so müssen eben genau diese 4 Bytes wieder ausgelesen und ev. gedreht werden. Wenn Byte für Byte reingeschrieben wurde erübrigt sich die Umrodnung.
Simon
-
(Das mit Hex und Dez ist mir klar, ich wundere mich nur um die Reihenfolge).
Ich habe leider keine Infos über die Datei, ich weiß, dass es ein Binräformat ist und dass es ein unkomprimiertes Bild sein soll, dessen Farbkomponenten 3er Tupel sind (Ich gehe davon aus, dass es RGB Byte 3er Tupel sind)
Mir fehlt aber jede weitere info, also Dimension des Bildes. Meine Vermutung ist, dass die ersten 4 Bytes Breite, die nächsten 4 Bytes Höche und der Rest byteweise RGB,RGB,RGB darstellt.Mich wundert es, warum das gg Array weiter oben der Reihe nach [0] = 0, [1] = 0, [2] = 2 und [3] = 57 ausgibt, wenn es allerdings in interpretiert werden soll als 57,2,0,0 genommen wird. Schlägt Endian erst bei dem reinterpret_cast zu? Also erst von char[] zu int, weil dort das msb ganz hinten ist?