Binärvergleich um Patcher zu programmieren?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Binärvergleich um Patcher zu programmieren?

Beitrag 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
Benutzeravatar
Proton
Beiträge: 152
Registriert: 20.06.2006 12:21
Wohnort: Eckernförde /Stadtbergen

Beitrag 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]
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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Beitrag 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)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Proton
Beiträge: 152
Registriert: 20.06.2006 12:21
Wohnort: Eckernförde /Stadtbergen

Beitrag 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.
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.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Beitrag 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
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Antworten