datei binär/hexadezimal öffnen sowie durchsuchen
-
hallo,
versuche ein program zu schreiben, das folgendes kann:
in .part.met dateien (sind dateien welche emule anlegt) nach der binär/hex? folge: 03 01 00 14 00 suchen. wird solch eine binär reihe gefunden, sollen weitere aktionen mit der datei ausgeführt werden.
das problem fängt nun jedoch bereits beim einlesen an. das orginale datei format ist mir momentan unbekannt. (die von mir gesuchte binär folge habe ich per ultraEdit 32 gefunden.)
jedoch habe ich bereits bei folgendem test programm probleme:FILE *in; FILE *out; int Data; int main(void) { //Versuche Quelldatei im Binärmodus zu öffnen... if((in = fopen("c:\\test.part.met","rb")) == NULL) // rb steht für Read Binary { //Datei konnte nicht geöffnet werden! } //Erfolgreich geöffnet! //Versuche Zieldatei im Binärmodus zu öffnen... if((out = fopen("test.txt","wb")) == NULL) // wb steht für Write Binary { //Datei konnte nicht geöffnet werden! } // Möchtest du die Ausgabe an die Ausgabedatei anhängen dann benutze statt // "wb" <> "ab" (Append Binary) //Erfolgreich geöffnet! while ((Data = fgetc(in)) != EOF) { fputc(Data,out); } //Dateien werden geschlossen! fclose(in); fclose(out); //Kopiervorgang abgeschlossen!
diese zeilen benutze ich noch für versuchszwecke, da ich noch nicht weiß wie ich eine "echte" binär (hex?) darstellung zusamen bringe. (sowie später diese durchsuche)
auf jeden fall enthalten nach obigen zeilen die orginal test.part.met und test.txt nich den selben inhalt.??mit FileOpen habe ich ein laden in ein memo auch bereits probiert.
das funktionierte jedoch noch weniger.ich hoffe es kann mir jemand helfen.
-
Hi,
Du öffnest die Datei und interpretierst die bytes,Words,DWords oder wie auch immer du deine Einheit wählst als Hex-Werte und schreibst diese zurück in die zweite datei.
-
Hi
Ok das war vielleicht etwas kurz.
#include<fstream> using namespace std; fstream in,out; in.open("infile.part.met",ios::in|ios::binary); out.open("hexout.dat",ios::out); unsigned char c; while(true){ in>>c; if(in.eof()) break; out<<ios::hex<<c; }
Ohne das jezt getestet zu haben. Aber so ungefähr müsste es gehen.
-
danke ein mal für die schnelle antwort.
habe mit dem code etwas rum probiert.per compiler läuft er.
laut hex editor jedoch, (UltraEdit32) hat die ausgabe file nichts mehr zu tun mit der eingelesenen file. (unter anderem mehr als doppelte zeilenanzahl usw.)auf irgend einer ebene konvertiert fstream scheinbar die datei falsch.
auf die schnelle habe ich es jetzt nur mit den ios::binary sowie ios::hex und deren veränderung/vertauschung probiert. leider jedoch ohne erfolg.
noch etwas infos:
anfang der orginalen test.part.met:
d @RnTþû}l]³/d @R... (UE32, hex modus aus/also wie in wordpad)
64 00 00 00 40 52 6E... (UE32, hex modus ein)anfang der mit dem code erstellten kopie test.dat:
16d16 16 16 16@16R16n16... (UE32, hex modus aus/also wie in wordpad)
31 36 64 31 36 00 31 36 00... (UE32, hex modus ein)weiß nicht ob das jetzt hilft. aber bin mir nicht einmal mehr sicher ob nicht irgendwo ein denkfehler meinerseits ist. den "hex sollte ansich ja hex sein...?"
vermute jedoch ein fehler in der ausgabe.
beim einlesen wird nach hex konvertiert. beim schreiben sollte ich vermutlich zurück nach ???(was auch immer orginal das orginal format ist (??asci??)) konvertieren.?
-
ok, zumindest versuchsweise scheint das reine einlesen sowie anzeigen in einem memo nun zu funktionieren.
mit folgendem code zeigt das memo (unformatiert) die file mit den richtigen hex werten an:
#include<fstream> using namespace std; fstream in,out; in.open("infile.part.met",ios::in|ios::binary); out.open("hexout.dat",ios::out); unsigned char c; while(true){ in>>c; if(in.eof()) break; AnsiString temp = IntToHex(c,2); Memo1->Lines->Add(temp); out<<ios::hex<<c; }
wegen ausgabe usw. werde ich morgen einmal weiterschauen.
vermutlich geht es auch per direktem hex einlesen. aber auch das kommt morgen...