Patches für Programme
-
Ok, also die beiden Programme von der GNU Seite sind zu groß um sich da
einzuarbeiten in der Zeit kann ich auch gleich von vorne anfangen und
experimentieren (will ja nix fertiges nehmen, sonst wäre es ja ok :))Bin mir jetzt nicht sicher, ob ich es richtig verstanden habe, daher mal nen Beispiel
Version1.0
4D 3F 43 12 FF 34 56 67 9A 1BVersion 2.0
4D 3F 43 13 5B 7C 8A FF 34 56 67 9A 1B-öffne Datei1 und Datei2
-1. Byte einlesen und vergleichen -> gleich
-2. Byte einlesen und vergleichen -> gleich
-3. Byte einlesen und vergleichen -> gleich
-4. Byte einlesen und vergleichen -> verschieden -> speichern von 4.Byte = 13
-5. Byte einlesen und vergleichen -> verschieden -> speichern von 5.Byte = 5B
-6. Byte einlesen und vergleiche -> verschieden -> speichern von 6.Byte = 7C
...Mein Grundgerüst scheitert ab da wo zusätzliche Zeichen eingefügt werden, so würde
ja der Rest des Binaries verschieden sein, da die Bytes ja verschoben wurden.Wie kann ich das lösen? Ich weiß ja nicht ob das 8.Byte aus Datei1 und das 11.Byte
aus Datei2 das gleiche symbolisieren und nur zufällig den gleichen Wert haben.
-
speicher am besten am Anfang gleich die Länge der 2. Version und fahr dann eben fort mit 11=...
-
Wie meinst du das genau? Ist mir grad irgendwie nicht so ganz klar

Ich habe heute Mittag mal kurz Zeit gehabt um mir die Quellcodes von dem Difftool etwas näher
anzuschauen und in der Datei analysis.c bin ich auf folgenden Kommentar gestoßen: "The basic algorithm is described in:
"An O(ND) Difference Algorithm and its Variations", Eugene Myers,
Algorithmica Vol. 1 No. 2, 1986, pp. 251-266;
see especially section 4.2, which describes the variation used below.
Unless the --minimal option is specified, this code uses the TOO_EXPENSIVE
heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N)
at the price of producing suboptimal output for large inputs with
many differences.The basic algorithm was independently discovered as described in:
"Algorithms for Approximate String Matching", E. Ukkonen,
Information and Control Vol. 64, 1985, pp. 100-118. "Ich habe bei Amazon mal nach diesen Büchern oder den Autoren gesucht, aber nichts dazu gefunden.
Aber mit ner ungenauen Suche bzw. nem ungenauen Vergleich (natürlich zu gunsten der neueren Version) die Dateien abzugleichen,
leuchtet mir irgendwie ein, jetzt müsste man nur noch wissen wie so etwas funktioniert
-
-
das GNU diff Tool ist glaube ich eh nicht für Binarys geeignet. Aber du könntest das Format so machen:
dateia: AA BB CC DD EE dateib: AA BB CC DD EE FF 11 diff: length=7 5=FF 6=11im patch Tool erzeugst du dann eben ein Array der Länge 7 und liest alle bytes aus dateia, bis irgend ein Datei in der diff Datei anders angegeben wurde.
-
Bei der Methode stoße ich ja auf das oben genannte Problem. Anscheinend gibt es nur wenige die so etwas können, bei codeproject.com
verwenden die undokumentierte API Funktionen von Windows dafür.
Ich denke ich werde auch zu dieser Methode greifen
Scherfgen benutzt wohl auch einen einfachen vergleich
-
bei codeproject.com verwenden die undokumentierte API Funktionen von Windows dafür.
gib mal links auf die artikel bitte

-
Hab schon.
-
kingruedi schrieb:
das GNU diff Tool ist glaube ich eh nicht für Binarys geeignet.
Stimmt, dafür verwendet man xdelta.

-
@SirLant
nein, du stößt nicht auf das Problem, du scheinst mich nur nicht zu verstehen
-
Dann erklärs mir doch noch einmal

-
das ist ja nur eine Frage der Syntax deines diff-Formats, du kannst ja die Informationen so abspeichern
Byte=10 Insert=FF AA
dann weisst du ja, dass du einfach nur zwei bytes an der Position 10 einfügen sollst. Replace nimmst du dann wenn du ersetzen willst usw.
-
Habe jetzt lange darüber nach gedacht und glaube ich habe dich jetzt verstanden.
Bei meinem Beispiel würde das File dann so aussehen
Version1
4D 3F 43 12 FF 34 56 67 9A 1BVersion2
4D 3F 43 13 5B 7C 8A FF 34 56 67 9A 1BDas Patchfile
Byte = 4; Insert = 13 5B 7C 8A FF 34 56;
Also das Programm stoppt dort wo der erste Unterschied ist und liest anschließend
Byte für Byte das sich unterscheidet in das Patchfile, bis die Bytes wieder
gleich sind.Meinst du das so?
-
ich würde bei Insert einfach nur einfügen und am Ende einfach mit der normalen Datei fortfahren. Replace nimmt man dann fürs ersetzen oder so
-
Aber wie unterscheide ich wann ich einsetzen oder ersetzen soll, beim erstellen der Datei (beim patchen selber ist ja klar, da stehts dann in der datei
)
-
hmm, du könntest suchen ob das Muster was folgt innerhalb der nächsten n Bytes nocheinmal vorkommt

-
SirLant schrieb:
Aber wie unterscheide ich wann ich einsetzen oder ersetzen soll
Mach doch 2 Läufe.
Beim 1. Lauf wird nur eingefügt bzw. gelöscht.
Beim 2. Lauf wird dann aus eingefügt und danach gelöscht ein ersetzen.
Also quasi eine Optimierung
-
Hi
du solltest auch die 3. möglichkeit nicht vergessen. etwas entfernen. könnte ja mal vorkommen, das die datei kleiner wird.
somit gibts 3 möglichkeiten
1. einfügen
2. ersetzen
3. entfernenwobei 2 sich ja erste entfernen und einfügen zusammensetzen lässt.
wenn du erste einfügst oder entfernst musst du die adressen des 2. durchlaufen entsprechend mitziehen(verschieben). weiter würd ich die dateien von hinten nach vorhe durcharbeiten. da dadurch keine änderungen an den verbleibenden Adressen entstehen.
gruss Termite