Binärvergleich um Patcher zu programmieren?
Binärvergleich um Patcher zu programmieren?
Hallo,
hat jemand eine Idee, wie man am cleversten einen Binärvergleich macht, der jedoch die "Differentdatei" nicht unnötig aufbläht?
Konkreter Anwendungsfall:
Es existiert Applikation1 Version 1.01, welche zur Version 1.05 weiterentwickelt wurde. Jetzt soll als Update jedoch nicht die komplette Version 1.05 weitergegeben werden, sondern lediglich eine Datei, in der die binären Unterschiede zur Version 1.01 festgehalten sind. Am Ende sollte dann aus der vorhandenen Version 1.01 eine Version 1.05 gepatcht werden.
Meine bisherige Überlegung und Problemstelle:
Wenn ich beim Binärvergleich bei festen "Adressen" bleibe, dann führt ja bereits der erste Unterschied dazu, dass alle nachfolgenden Werte abweichen. Wie geht man denn da vor?
Danke und Gruß
Michael
hat jemand eine Idee, wie man am cleversten einen Binärvergleich macht, der jedoch die "Differentdatei" nicht unnötig aufbläht?
Konkreter Anwendungsfall:
Es existiert Applikation1 Version 1.01, welche zur Version 1.05 weiterentwickelt wurde. Jetzt soll als Update jedoch nicht die komplette Version 1.05 weitergegeben werden, sondern lediglich eine Datei, in der die binären Unterschiede zur Version 1.01 festgehalten sind. Am Ende sollte dann aus der vorhandenen Version 1.01 eine Version 1.05 gepatcht werden.
Meine bisherige Überlegung und Problemstelle:
Wenn ich beim Binärvergleich bei festen "Adressen" bleibe, dann führt ja bereits der erste Unterschied dazu, dass alle nachfolgenden Werte abweichen. Wie geht man denn da vor?
Danke und Gruß
Michael
Wenn es da eine vernünftige Möglichkeit gäbe, hätte man sie schon gefunden
und ALLE würden es genauso machen.
Nichtsdestotrotz: Du kannt ja weiterhin nach einem Algo suchen. Wenn du ihn
gefunden hast, winkt dir auf jeden Fall eine menge Geld
Eine simple Methode wäre eine Update-Datei mit folgendem Aufbau:
[SOF]
ADDRESSE (ab wo geändert wird), OLDLEN (alte länge Daten), NEWLEN (neue länge Daten), DATEN....,
ADDRESSE (ab wo geändert wird), OLDLEN (alte länge Daten), NEWLEN (neue länge Daten), DATEN....,
ADDRESSE (ab wo geändert wird), OLDLEN (alte länge Daten), NEWLEN (neue länge Daten), DATEN....,
.
.
.
[EOF]
und ALLE würden es genauso machen.

Nichtsdestotrotz: Du kannt ja weiterhin nach einem Algo suchen. Wenn du ihn
gefunden hast, winkt dir auf jeden Fall eine menge Geld

Eine simple Methode wäre eine Update-Datei mit folgendem Aufbau:
[SOF]
ADDRESSE (ab wo geändert wird), OLDLEN (alte länge Daten), NEWLEN (neue länge Daten), DATEN....,
ADDRESSE (ab wo geändert wird), OLDLEN (alte länge Daten), NEWLEN (neue länge Daten), DATEN....,
ADDRESSE (ab wo geändert wird), OLDLEN (alte länge Daten), NEWLEN (neue länge Daten), DATEN....,
.
.
.
[EOF]
Zitat:
"Ich kann mich vor die Meute stellen und für Nichts kämpfen. Ich kann aber auch einen Schritt zur Seite gehen, die Meute vorbeiziehen lassen und dabei meine Zeit angenehm bei Freunden verbringen.". Da hat er Recht, mein Pap's.
"Ich kann mich vor die Meute stellen und für Nichts kämpfen. Ich kann aber auch einen Schritt zur Seite gehen, die Meute vorbeiziehen lassen und dabei meine Zeit angenehm bei Freunden verbringen.". Da hat er Recht, mein Pap's.
Ich würde das überhaupt nicht so machen!
Das ist ja so, als schneidest du alle Herzen aus deiner Unterhose aus, um sie durch Teddybären zu ersetzen. Damit haste aber noch nicht die Unterhose gwechselt!
Ich wüde es so machen, dass du nur geänderte Dateien in das Update packst. Sagen wir, dein Programm besteht aus einer EXE, drei DLLs und haufenweise BMPs. Dann überschreibst du z. B. nur DLL 1 und 2 und ein paar BMPs, weil nur die sich seit der letzten Version geändert haben.
In den Dateien selber rumzudoktern finde ich nicht gut und außerdem zu aufwändig. Wie sagte man mir letztens noch? "ImZeitalter von GB, TB und sogar PB sind Dateigrößen egal!" Außerdem haben viele einen schnellen internetanschluss, sodass du ruhig etwas verschwenderischer mit den Ressourcen sein kannst.
Oder du verfolgst eine andere Strategie, wie z. B: Avira (ehemals AntiVir): Wenn das Ding sich die neuesten Virendefinitionen runterläd, hängt er diese einfach an die alte Definitionsdatei an, aber schneidet nirgendwo was raus, um etwas anderes an der Stelle einzufügen... SO sind die Downloads wesentlich kleiner. Sie liegen aktuell bei ca. 20 bis 40 KB, früher bei 1,9 MB.
Das ist ja so, als schneidest du alle Herzen aus deiner Unterhose aus, um sie durch Teddybären zu ersetzen. Damit haste aber noch nicht die Unterhose gwechselt!
Ich wüde es so machen, dass du nur geänderte Dateien in das Update packst. Sagen wir, dein Programm besteht aus einer EXE, drei DLLs und haufenweise BMPs. Dann überschreibst du z. B. nur DLL 1 und 2 und ein paar BMPs, weil nur die sich seit der letzten Version geändert haben.
In den Dateien selber rumzudoktern finde ich nicht gut und außerdem zu aufwändig. Wie sagte man mir letztens noch? "ImZeitalter von GB, TB und sogar PB sind Dateigrößen egal!" Außerdem haben viele einen schnellen internetanschluss, sodass du ruhig etwas verschwenderischer mit den Ressourcen sein kannst.
Oder du verfolgst eine andere Strategie, wie z. B: Avira (ehemals AntiVir): Wenn das Ding sich die neuesten Virendefinitionen runterläd, hängt er diese einfach an die alte Definitionsdatei an, aber schneidet nirgendwo was raus, um etwas anderes an der Stelle einzufügen... SO sind die Downloads wesentlich kleiner. Sie liegen aktuell bei ca. 20 bis 40 KB, früher bei 1,9 MB.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> Das ist ja so, als schneidest du alle Herzen aus deiner Unterhose aus, um sie durch Teddybären zu ersetzen. Damit haste aber noch nicht die Unterhose gwechselt!
das is ja mal ne analogie.
aber im grunde gehts bei nem patch genau darum.
die von dir propagierte methode funktioniert nur,
wenn man von vornherein sein programm auf DLLs aufbaut,
um es besser patchable zu halten.
aber es ist die bessere lösung.
wenn das programm zu fishy ist,
ist der arbeitsaufwand für das erstellen des Patches unverhältnismäßig hoch.
da sollte man dann doch einen komplettdownload der neuen version vorziehen.



aber im grunde gehts bei nem patch genau darum.
die von dir propagierte methode funktioniert nur,
wenn man von vornherein sein programm auf DLLs aufbaut,
um es besser patchable zu halten.
aber es ist die bessere lösung.
wenn das programm zu fishy ist,
ist der arbeitsaufwand für das erstellen des Patches unverhältnismäßig hoch.
da sollte man dann doch einen komplettdownload der neuen version vorziehen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
ja, ihr habt ja recht, es wäre besser, wenn man nur die geänderten teile austauscht, leider ist das für mich nicht möglich (da ich hier keinen einfluss auf die eigentliche entwicklung habe und nur einen "workaround" schaffen will)
zur sache mit dem verschwenderisch sein möchte ich noch sagen, dass das Programmpaket 200MB frisst
(da wäre ein Patch mit 50MB bereits ein tolles ergebnis)
zur sache mit dem verschwenderisch sein möchte ich noch sagen, dass das Programmpaket 200MB frisst

@ Kaeru, tja, das war so meine erste Idee, die mir zum Thema einfiel...
@pvmichi: Aha
Trotzdem: ich glaube noch nicht an TB und schon gar nicht an PB, wie mir das neulich vor die Nase gehalten wurde. Das mit den DLLs war übrigens nur ein beispiel, es kann sih genauso gut um INIs oder CFGs handeln...

@pvmichi: Aha

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
@pvmichael
Willst du uns damit sagen, dass du eine einzige Datei mit 200MB hast ?
Mache dir mal Gedanken über dein grundsätzliches Programmierprinzip,
bevor du mit "Sparplänen" rumläufst.
Willst du uns damit sagen, dass du eine einzige Datei mit 200MB hast ?
Mache dir mal Gedanken über dein grundsätzliches Programmierprinzip,
bevor du mit "Sparplänen" rumläufst.
Zitat:
"Ich kann mich vor die Meute stellen und für Nichts kämpfen. Ich kann aber auch einen Schritt zur Seite gehen, die Meute vorbeiziehen lassen und dabei meine Zeit angenehm bei Freunden verbringen.". Da hat er Recht, mein Pap's.
"Ich kann mich vor die Meute stellen und für Nichts kämpfen. Ich kann aber auch einen Schritt zur Seite gehen, die Meute vorbeiziehen lassen und dabei meine Zeit angenehm bei Freunden verbringen.". Da hat er Recht, mein Pap's.
machs halt so, anhand einer prüfsumme überprüfst du um welche version der zu patchenden datei es sich eigentlich handelt, dann kannst du je nach version diese dementsprechen nur dort patchen wo was gepatcht werden muss.
pseudocode:
edit:
c ya,
nco2k
pseudocode:
Code: Alles auswählen
checksum = zu patchende datei
Select checksum
Case v1.00
patche das was nötig ist
Case v1.01
patche das was nötig ist
Case v1.02
patche das was nötig ist
Case aktuelle version
patchen nicht nötig
Default
ungültige oder neuere datei, patchen nicht möglich
EndSelect
indem du die längendifferenz immer mit einkalkulierst, für die nächste änderung.Wenn ich beim Binärvergleich bei festen "Adressen" bleibe, dann führt ja bereits der erste Unterschied dazu, dass alle nachfolgenden Werte abweichen. Wie geht man denn da vor?
c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Wie gesagt, das Teil stammt nicht von mir und ich habe da keinen Einfluß darauf...Proton hat geschrieben:@pvmichael
Willst du uns damit sagen, dass du eine einzige Datei mit 200MB hast ?
Mache dir mal Gedanken über dein grundsätzliches Programmierprinzip,
bevor du mit "Sparplänen" rumläufst.
@ nco2k
werd mal schaun, ob ich sowas zustande bringe... jedenfalls danke
@pvmichael: guckst Du mal hier, oder hier, oder hier
Zu bedenken ist, dass Patchen von Binärdateien nur bei geringen Änderungen sinnvoll ist, da die komplettee Patchinformation relativ umfangreich im Verhältnis zur eigentlichen Änderung ist. Seine Stärken hat die Patcherei bei textorientierten Daten.
... bitte vor dem posten recherchieren. Oder wenn Du schon aus dem hohlen Bauch heraus etwas behaupten musst, dann kennzeichne es bitte durch Sätze wie "ich glaube, dass ..." oder "ich bin der Meinung, dass ...", dann sind wir wenigstens gewarnt. Jeder lahme Autofahrer setzt aus diesem Grund nen Hut auf
Sei mir nicht böse, aber hier im Forum wird manchmal so ein Schwachsinn verzapft, dass es einfach mal gesagt werden musste.
Zu bedenken ist, dass Patchen von Binärdateien nur bei geringen Änderungen sinnvoll ist, da die komplettee Patchinformation relativ umfangreich im Verhältnis zur eigentlichen Änderung ist. Seine Stärken hat die Patcherei bei textorientierten Daten.
Nur weil Du keine kennst, heißt es nicht, dass es keine gibt ...Proton hat geschrieben:Wenn es da eine vernünftige Möglichkeit gäbe, hätte man sie schon gefunden und ALLE würden es genauso machen.


Sei mir nicht böse, aber hier im Forum wird manchmal so ein Schwachsinn verzapft, dass es einfach mal gesagt werden musste.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."
Es gibt keine Vista-Witze. Es ist alles wahr!
Es gibt keine Vista-Witze. Es ist alles wahr!