Seite 1 von 2

Binärvergleich um Patcher zu programmieren?

Verfasst: 12.09.2006 15:37
von pvmichael
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

Verfasst: 12.09.2006 15:41
von Proton
Wenn es da eine vernünftige Möglichkeit gäbe, hätte man sie schon gefunden
und ALLE würden es genauso machen. :roll:

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


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]

Verfasst: 12.09.2006 16:12
von AND51
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.

Verfasst: 12.09.2006 16:22
von Kaeru Gaman
> 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!

:lol: :lol: :lol: 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.

Verfasst: 12.09.2006 16:51
von pvmichael
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)

Verfasst: 12.09.2006 17:12
von AND51
@ Kaeru, tja, das war so meine erste Idee, die mir zum Thema einfiel... :mrgreen:

@pvmichi: Aha :o 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...

Verfasst: 12.09.2006 18:11
von Proton
@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.

Verfasst: 12.09.2006 19:41
von nco2k
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:

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
edit:
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?
indem du die längendifferenz immer mit einkalkulierst, für die nächste änderung.

c ya,
nco2k

Verfasst: 13.09.2006 09:34
von pvmichael
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.
Wie gesagt, das Teil stammt nicht von mir und ich habe da keinen Einfluß darauf...



@ nco2k

werd mal schaun, ob ich sowas zustande bringe... jedenfalls danke

Verfasst: 13.09.2006 11:12
von stbi
@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.
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. :roll:
Nur weil Du keine kennst, heißt es nicht, dass es keine gibt ... :roll: ... 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 :D

Sei mir nicht böse, aber hier im Forum wird manchmal so ein Schwachsinn verzapft, dass es einfach mal gesagt werden musste.