Wie erreicht man die gleiche Komprimierung unter Linux und Windows?

1

Ich habe eine example.jar-Datei.   Ich versuche, eine Klassendatei im Jar zu aktualisieren.   Wenn ich die Klassendatei mit dem Dienstprogramm jar oder zip packe ( Kommandozeilen-Linux )

Ich habe es versucht :

jar uf myJarFile.jar MyclassFile.class

zip -u meine MyJarFile.jar MyclassFile.class

Ich bekomme eine Prüfsumme von XXYYZZ.

Aber wenn ich die gleiche Klassendatei in Windows packe, benutze ich 7zip (GUI) Ich bekomme eine andere Prüfsumme, zB MMNNOO.   Dies liegt an der Änderung des Kompressionsverhältnisses. Die mittlere Größe ist ebenfalls unterschiedlich.

Jetzt frage ich mich, wie ich das gleiche Kompressionsverhältnis erreichen kann dh gleiche Prüfsumme .

EDIT 1: Ich habe Glas in beiden Plattformen ausprobiert. beide produzieren unterschiedliche cksum ... :(

theRoot
quelle
Kompressionsverhältnis und Prüfsumme haben nichts miteinander zu tun. In einer ZIP-Datei handelt es sich bei der Prüfsumme um die nicht komprimierten Daten, sodass dies ohnehin keine Rolle spielt.
qasdfdsaq
1
Zuerst würde ich versuchen, 7zip auf beiden Plattformen oder jar auf beiden Plattformen zu verwenden (und das gleiche Tool zum Berechnen der CRCs zu verwenden, da die Methoden stark variieren), oder Sie vergleichen Äpfel immer mit Elefanten. Trotzdem bin ich mir fast sicher, dass Sie aufgrund der Eigenschaften des Dateispeichers, wie dem Dateisystem und der Beziehung von Dateidaten zu Dateisystemmetadaten, die zwischen NTFS und EXT4 stark variieren, unterschiedliche CRCs erhalten werden.
Frank Thomas

Antworten:

3

Die Prüfsumme ist ein Hash aller in der Datei enthaltenen Bits.

Windows und Linux / UNIX verwenden unterschiedliche Dateiendungen. Wenn Sie für jedes Betriebssystem mit demselben Tool eine Prüfsumme erstellen, wird immer eine andere Prüfsumme erstellt, es sei denn, Sie ändern die Zeilenenden speziell.

Überprüfen Sie anhand der Dateigröße, ob Sie dasselbe Komprimierungsverhältnis haben.

Das mag etwas anders sein, sollte aber minimal sein.

Der Punkt der Prüfsummen ist nicht zu sehen, ob 2 Dateien, die zu verschiedenen Zeiten oder an verschiedenen Orten erstellt wurden, gleich sind, sondern ob jemand oder etwas eine Datei geändert hat.

Wenn ich Ihnen eine Postleitzahl senden sollte, könnte ich sie prüfen und Ihnen dann die Postleitzahl und die von mir erstellte Prüfsumme per E-Mail zusenden.

Sie haben die Zip-Datei erhalten, die Prüfsumme erneut, und wenn die Prüfsummen übereinstimmen, hat sich die Datei seit dem Versand nicht geändert.

BEARBEITEN - Ich gehe mit dieser Antwort davon aus, dass die JAR unter Linux kompiliert und komprimiert wurde und auch unter Windows kompiliert und komprimiert wurde

Alex
quelle
Zeilenenden? Zip-Dateien haben keine Zeilenenden.
grawity
Richtig, aber was auch immer in der ZIP-Datei enthalten ist (wenn es sich um eine JAR-Datei handelt, Bytecode), hat Zeilenenden, wie jede Textdatei in der JAR-Datei.
Alex
Bytecode hat auch keine Zeilenenden, da es sich um Bytecode und nicht um Quellcode handelt. Trotzdem ändert zip standardmäßig nie die Zeilenenden, es sei denn, Sie aktivieren diesen Modus ausdrücklich.
grawity
Java-Klassendateien, die Bytecode enthalten, haben Zeilenenden, die auf der Architektur basieren, auf der die Klasse kompiliert wurde. Wenn Sie ein Java-Programm kompilieren und die Klassendatei in Notepad ++ öffnen und so einstellen, dass Zeichen für das Zeilenende angezeigt werden, werden LF für UNIX-kompilierte Klassen und CR LF für Windows-Klassen angezeigt. Die Klasse ist im Wesentlichen immer noch eine ASCII-Datei. Diese Zeilenenden sind eigenständige Zeichen, daher werden sie in die ZIP-Datei komprimiert, sodass der Inhalt unterschiedlich ist und zu einer anderen Prüfsumme führt.
Alex