Speicher analysieren und Änderungen merken.
-
Hi Jungs und Mädels!
Folgendes Problem: Ich habe eine Datei (sagen wir Größenordnung von 500-1500 MByte) und darin wurden kleine Änderungen vorgenommen, z. B. ein Speicherblock der Länge von 100 Byte wurde an Byte 1499 eingefügt, ein anderer Speicherblock der Länge von 10 Byte an Position 99 rausgeworfen usw.
Also sogesehen viele Änderungen an einer Datei die recht kräftig groß ist. Soweit sogut. Da es sich jedoch meistens im kleine Änderungen handelt z. B. ein Rechtschreibfehler wurde in einem Text-Chunk der Datei korregiert oder ein Bitmap-Chunk in diese Datei eingefügt. Daher ist es totaler wahnsinn die ganze Datei über das Internet zu senden, vorallem wenn sie so groß ist.
Jetzt habe ich mir daher folgendes Überlegt: Ich möchte die beiden Dateien vergleichen und die Unterschiede herausschneiden und nur diese Änderungen versenden, damit diese später in die alte Datei eingefügt werden und ich nicht mehrere Hundert MByte versenden musste, sondern nur paar Hundert KByte bzw. wenige MByte.
Doch da habe ich leider eine etwas größere Denkblockade drin, bei der Analyse vom Speicher um diese Unterschiede zu selektieren.
Ich habe mal folgendes Testprogramm geschrieben, jedoch könnte ich etwas Hilfe dabei gebrauchen bzw. ein paar gute Denkanstöße.
int main (void) { // 0 1 2 3 4 5 6 7 8 9 unsigned char old_data[] = { 'H', 'A', 'l', 'l', 'O', ' ', ' ', ' ', 'D', 'U' }; unsigned long old_data_size = sizeof (old_data) / sizeof (unsigned char); // 0 1 2 3 4 5 6 7 8 9 10 unsigned char new_data[] = { 'H', 'A', 'L', 'L', 'O', ' ', 'D', 'A', ' ', 'D', 'U' }; unsigned long new_data_size = sizeof (new_data) / sizeof (unsigned char); for (unsigned long position = 0, i = 0; position < new_data_size; ) { for (i = position; old_data[position + i] != new_data[position + i]; ++i); if (i) std::cout << "von " << position; position = 1 + i; if (i) std::cout << " bis " << position << std::endl; } return 0; }Die Ausgabe sollte folgende sein:
von 2 bis 3 # Hier wurde modifiziert: l durch L von 6 bis 8 # Hier wurde modifiziert und eingefügt: Zeichen 6 bis 7 durch "DA" ersetzt und 8 ein Leerzeichen eingefügt.Gut, davon ist der Code noch weit entfernt, aber nur so zur verdeutlichung.
Bin für jede Hilfe dankbar die mir bei der Lösung des Problems behilflich ist dankbar

so long!
- unsigned long