Hallo *.*
Hat jemand eine Funktion für o.g Operation alla _binarysearchreplace($_BinFile, 0xD64267FA88BF38EE, 0x3E49C1D64267FA88) ?
Grüße
Jonny
Hallo *.*
Hat jemand eine Funktion für o.g Operation alla _binarysearchreplace($_BinFile, 0xD64267FA88BF38EE, 0x3E49C1D64267FA88) ?
Grüße
Jonny
Ja, die heißt Datei binär einlesen, also FileOpen(Datei, 16) und FileRead(Datei). Dann den String durchsuchen, ersetzen und in die Datei schreiben.
Ein direktes "Ersetze XY durch AB an Position Z" scheint es nicht zu geben.
Falls doch, bitte melden, ich könnte es nämlich auch gebrauchen. 300 MB zu lesen, 6 Bytes zu ändern und wieder zu speichern ist blöd.
Minimales OT: Kann man irgendwie C#/C++ -Funktionen nach AutoIt bringen, da gibts nämlich Funktionen dafür. Auch nicht unbedingt leicht, aber man könnte ja ne UDF schreiben, wenns dann mal in AutoIt funktioniert.
Sind die zu ersetzenden und die neuen Binärdaten gleich lang? Dann funktioniert folgende Befehlsfolge:
[autoit]_WinAPI_CreateFile
_WinAPI_SetFilePointer(
_WinAPI_WriteFile(
_WinAPI_CloseHandle
Dazu muss auch die Stelle bekannt sein, an der ersetzt werden soll, Suche funktioniert nicht.
Danke, Du bist der Beste.
Da muss man erstmal drauf kommen. Ich habe in den AutoIt-File-Funktionen und in den UDF-File-Funktionen geschaut, aber wer kommt schon auf die WinAPI?!
Danke noch mal. ![]()
In der Beta gibt es auch FileSetPos für de Standard-Funktionen, aber das funktioniert noch nicht richtig.
Ja wär ein guter Ansatz, wenn die Position bekannt ist.
Konkret ist es so :
Der Binärstring kommt in der Datei immer 2 mal vor, einmal an einer konstanten Stelle (dann würds klappen), aber anschließend nochmal an einer "anderen" (unbekannten) Stelle.
Jetzt kann dieser String zwischen 3 und 32 Zeichen lang sein, d.h ich muss auch noch auffüllen mit 0x20 oder 0x00 wenn der String den ich schreiben will, kürzer ist als der erste.
Könnte es so gehen ?
Pointer auf 0, dann immer um 1 inkrementieren bis Fileende.Immer die letzten 32 Bytes merken und prüfen ob dort der Suchstring enthalten ist.
Wenn er gefunden ist, muss der Pointer gerade 1 Byte hinter dem letzten Byte des Suchstrings stehen. Jetzt den Pointer um die Länge des Suchstrings rückwärts minus 1 und ab dieser Stelle den ersetzenden String schreiben. Die folgenden Bytes (32- Länge String) mit 0xx auffüllen.
Oder 1 Fileread Durchlauf, zum Bestimmen der Position(en), dann Pointer drauf und schreiben.
Klingt irgendwie einfach, kann doch aber nich sein oder ? ![]()
Schau mal bei _WinAPI_ReadFile() da ist dein Problem fast genau als Beispiel angegeben.
Den Inhalt der struct kannst du entweder "zu Fuß" durchsuchen oder die struct in einen String kopieren und dort per stringreplace() deinen String ersetzen. Den String wieder zurück in die struct und von da ins File....