{"id":3694,"date":"2017-02-24T01:08:33","date_gmt":"2017-02-23T23:08:33","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3694"},"modified":"2017-02-24T01:08:33","modified_gmt":"2017-02-23T23:08:33","slug":"die-schnittstelle-checksum","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/02\/die-schnittstelle-checksum\/","title":{"rendered":"Die Schnittstelle Checksum"},"content":{"rendered":"<p>Wir finden Zugang zur Pr\u00fcfsummenberechnung \u00fcber die Schnittstelle java.util.zip.Checksum, die f\u00fcr ganz allgemeine Pr\u00fcfsummen steht. Eine Pr\u00fcfsumme wird entweder f\u00fcr ein Feld oder ein Byte berechnet. Checksum liefert die Schnittstelle zum Initialisieren und Auslesen von Pr\u00fcfsummen, die die konkreten Pr\u00fcfsummen-Klassen implementieren m\u00fcssen.<\/p>\n<p>interface\u00a0java.util.zip.Checksum<\/p>\n<ul>\n<li>longgetValue()<br \/>\nLiefert die aktuelle Pr\u00fcfsumme.<\/li>\n<li>voidreset()<br \/>\nSetzt die aktuelle Pr\u00fcfsumme auf einen Anfangswert.<\/li>\n<li>voidupdate(intb)<br \/>\nAktualisiert die aktuelle Pr\u00fcfsumme mit dem Byte in b.<\/li>\n<li>voidupdate(byte[]b,intoff,intlen)<br \/>\nAktualisiert die aktuelle Pr\u00fcfsumme mit den Bytes aus dem Array.<\/li>\n<li>default public void update(byte[] b)<br \/>\nImplementiert als update(b, 0, b.length); \u2013 neu in Java 9.<\/li>\n<li>default public void update(ByteBuffer buffer)<br \/>\nAktualisiert die Pr\u00fcfsumme mit den Bytes aus dem buffer. Neu in Java 9.<\/li>\n<\/ul>\n<p>Die Standardbibliothek bietet bisher drei Klassen f\u00fcr die Pr\u00fcfsummenberechnung als Implementierungen von Checksum:<\/p>\n<ul>\n<li>util.zip.CRC32: CRC-32 basiert auf einer zyklischen Redundanzpr\u00fcfung und testet etwa ZIP-Archive oder PNG-Grafiken. Nativ in C programmiert.<\/li>\n<li>util.zip.CRC32C: CRC-32C nutzt ein anderes Polynom als CRC-32, verfolgt aber das gleiche Berechungsprinzip. Das JDK implementiert es in purem Java und nicht nativ. Die Ausf\u00fchrungszeit kann dennoch besser sein. Neu in Java 9.<\/li>\n<li>util.zip.Adler32: Die Berechnung von CRC-32-Pr\u00fcfsummen kostet viel Zeit. Eine Adler-32-Pr\u00fcfsumme kann wesentlich schneller berechnet werden und bietet eine ebenso geringe Wahrscheinlichkeit, dass Fehler unentdeckt bleiben.<\/li>\n<\/ul>\n<h2>Die Klasse CRC32<\/h2>\n<p>Oft sind Polynome die Basis der Pr\u00fcfsummenberechnung. Eine h\u00e4ufig f\u00fcr Dateien verwendete Pr\u00fcfsumme ist CRC-32.<\/p>\n<p>Nun l\u00e4sst sich zu einer 32-Bit-Zahl eine Pr\u00fcfsumme berechnen, die genau f\u00fcr diese 4 Byte steht. Damit bekommen wir aber noch keinen ganzen Block kodiert. Um das zu erreichen, berechnen wir den Wert eines Zeichens und XOR-verkn\u00fcpfen den alten CRC-Wert mit dem neuen. Jetzt lassen sich beliebig Bl\u00f6cke sichern. Die Berechnung ist insgesamt sehr zeitaufw\u00e4ndig, und Adler-32 stellt eine schnellere Alternative dar.<\/p>\n<p>Beispiel<\/p>\n<p>Die Klasse CRC32 berechnet eine Pr\u00fcfsumme \u00fcber alle durchlaufenden Bytes, die gereicht werden als einzelne Bytes oder Felder. In aller K\u00fcrze sieht ein Programm zur Berechnung von Pr\u00fcfsummen f\u00fcr ein paar Eingaben folgenderma\u00dfen aus:<\/p>\n<pre>CRC32\u00a0crc\u00a0=\u00a0new\u00a0CRC32();\ncrc.update(\u00a01\u00a0);\ncrc.update(\u00a0new\u00a0byte[]{\u00a02,\u00a03,\u00a04,\u00a05,\u00a06,\u00a07\u00a0}\u00a0);\nSystem.out.println(\u00a0crc.getValue()\u00a0);\u00a0\/\/\u00a01894017160<\/pre>\n<p>CRC32 implementiert nicht nur alle Methoden, sondern f\u00fcgt noch zwei Methoden und nat\u00fcrlich einen Konstruktor hinzu:<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir finden Zugang zur Pr\u00fcfsummenberechnung \u00fcber die Schnittstelle java.util.zip.Checksum, die f\u00fcr ganz allgemeine Pr\u00fcfsummen steht. Eine Pr\u00fcfsumme wird entweder f\u00fcr ein Feld oder ein Byte berechnet. Checksum liefert die Schnittstelle zum Initialisieren und Auslesen von Pr\u00fcfsummen, die die konkreten Pr\u00fcfsummen-Klassen implementieren m\u00fcssen. interface\u00a0java.util.zip.Checksum longgetValue() Liefert die aktuelle Pr\u00fcfsumme. voidreset() Setzt die aktuelle Pr\u00fcfsumme auf einen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,85],"tags":[],"class_list":["post-3694","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-9"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3694","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3694"}],"version-history":[{"count":3,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3694\/revisions"}],"predecessor-version":[{"id":3697,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3694\/revisions\/3697"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}