Daffi Geschrieben 29. November 2010 Geschrieben 29. November 2010 (bearbeitet) Hi Leute, Ich habe folgendes Problem: Mir liegt ein Binärfile vor welches vom Aufbau her immer gleich ist. Die ersten 4 Byte ergeben zusammen eine Zahl. Ich hoffe ihr könnt mir helfen. Aufbau des Files im Hex Editor: 00 00 04 3E Das Ergebnis wäre also 1086 und soll in eine Datei geschrieben werden bzw als Variable gespeichert werden. Ich hoffe ihr versteht mein Problem und könnt mir eine Lösung anbieten. #include <iostream> #include <fstream> #include <stdio.h> using namespace std; int INT_little_endian_TO_big_endian(int i) { return((i&0xff)<<24)+((i&0xff00)<<8)+((i&0xff0000)>>8)+((i>>24)&0xff); } int main() { ifstream quelle; quelle.open("C:\\Users\\Daffi\\Desktop\\Bearbeiten2", ios::in | ios::binary ); if (!quelle) // Fehler beim Öffnen? cerr << "Eingabe-Datei kann nicht geöffnet werden\n"; char dataID[4]={0}; //Einlesen von 4 Bytes quelle.read(dataID, 4); /* Hier sollte nun irgendwie eine Zahl draus werden, zur Zeit wird nur der Hex Wert angezeigt*/ for (size_t i=0;i<4;i++){ cout<<hex<<(int)dataID[i]; } quelle.close(); getchar(); return 0; } MfG Paul Bearbeitet 29. November 2010 von Daffi Zitieren
Klotzkopp Geschrieben 29. November 2010 Geschrieben 29. November 2010 Warum liest du in ein char-Array ein, wenn du int willst? int i; quelle.read(reinterpret_cast<char*>(&i), sizeof(int));[/code] Zitieren
Daffi Geschrieben 29. November 2010 Autor Geschrieben 29. November 2010 weil read nur ein Char Array akzeptiert! Zitieren
Klotzkopp Geschrieben 29. November 2010 Geschrieben 29. November 2010 weil read nur ein Char Array akzeptiert!Den Code hast du aber gesehen, oder? Zitieren
Daffi Geschrieben 29. November 2010 Autor Geschrieben 29. November 2010 Warum liest du in ein char-Array ein, wenn du int willst? int i; quelle.read(reinterpret_cast<char*>(&i), sizeof(int)); Arg hatte ich nicht gesehen, sorry. ABer das geht nicht, er haut nur datenmüll raus: -1900781014 richtig wäre 1086 Zitieren
Klotzkopp Geschrieben 29. November 2010 Geschrieben 29. November 2010 er haut nur datenmüll raus: -1900781014Was und wie gibst du denn aus? "Er haut raus" ist keine besonders gute Beschreibung. Zitieren
Patrick_C64 Geschrieben 30. November 2010 Geschrieben 30. November 2010 (bearbeitet) Hi, also einlesen klappt soweit ?! Geh ich zumindest erstma von aus? Und ansonsten vllt. hilft Dir das hier weiter, wenn ich jetz vorbeigeschossen hab sry. brauchte Ablenkung und hab mir einen Teil deines Anliegens als Aufgabe genommen, hätte es gerne noch schicker gelöst aber mein C++ können ist noch naja sagen wir mal so .... bescheiden . #include <iostream> using namespace std; long HDez(char hex[],int sze,bool showcalc=false); //forward decl. int main() { char myHex[]="043E"; cout<<HDez(myHex,sizeof(myHex))<<endl; //optional kann Berechnung ausgegeben werden! } long HDez(char hex[], int sze,bool showcalc) { int curdigit=0; long output =0; int pos =0; for(int x=0;x<sze-1;x++) { pos =sze-x-2; curdigit = 0; switch (hex[pos]) { case 'F': case 'f': curdigit=15; break; case 'E': case 'e': curdigit=14; break; case 'D': case 'd': curdigit=13; break; case 'C': case 'c': curdigit=12; break; case 'B': case 'b': curdigit=11; break; case 'A': case 'a': curdigit=10; break; case '9': curdigit=9; break; case '8': curdigit=8; break; case '7': curdigit=7; break; case '6': curdigit=6; break; case '5': curdigit=5; break; case '4': curdigit=4; break; case '3': curdigit=3; break; case '2': curdigit=2; break; case '1': curdigit=1; break; case '0': curdigit=0; break; }; int hlpr =(16<<((x-1)*4)) ; if (hlpr<1) hlpr=1 ; output+=(curdigit*hlpr) ; if (showcalc==true)cout<<"HEX <"<<hex[pos]<<"> |"<<curdigit<<"*"<<hlpr<<"="<<(curdigit*hlpr)<<endl; }; return output; }; mfg. Patrick Bearbeitet 30. November 2010 von Patrick_C64 Zitieren
Patrick_C64 Geschrieben 30. November 2010 Geschrieben 30. November 2010 ... das Switch kann natürlich gekürzt werden, einfach die Cases für die Zahlen durch folgendes ersetzen. default: curdigit =(int) hex[pos]-'0'; break; Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.