{"id":117,"date":"2010-05-18T18:01:12","date_gmt":"2010-05-18T16:01:12","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=117"},"modified":"2025-03-02T11:31:58","modified_gmt":"2025-03-02T10:31:58","slug":"variable-7-bit-encoding","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2010\/05\/variable-7-bit-encoding\/","title":{"rendered":"Die variable 7-Bit-Kodierung f\u00fcr Integer-Werte"},"content":{"rendered":"<p>Die variable 7-Bit-Kodierung f\u00fcr Integer-Werte \u00e4hnelt der <a href=\"http:\/\/de.wikipedia.org\/wiki\/UTF-8\" rel=\"noopener\">UTF-8-Kodierung<\/a>. Je nach zu kodierendem Wert werden 1 bis n Byte belegt. Das h\u00f6chste Bit eines jeden Bytes gibt an, ob zur Abbildung eines Wertes ein weiteres Byte verwendet wurde.<!--more--><\/p>\n<p>Im Gegensatz zum UTF-8-Verfahren befinden sich die niederwertigsten Bits eines Wertes immer im ersten Byte. Au\u00dferdem kann jedes Byte exakt 7 Nutzbits aufnehmen. Die variable 7-Bit-Kodierung ist somit etwas effizienter. Es ist keine kodierungstechnische Wertbegrenzung vorhanden.<\/p>\n<table>\n<thead>\n<tr>\n<th>M\u00f6glichkeiten<\/th>\n<th>sinnvoller Wertebereich<\/th>\n<th>bin\u00e4re Kodierung<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>2<sup>7<\/sup><\/td>\n<td>0 - 127<\/td>\n<td>0xxxxxxx<\/td>\n<\/tr>\n<tr>\n<td>2<sup>14<\/sup><\/td>\n<td>128 - 16383<\/td>\n<td>1xxxxxxx 0xxxxxxx<\/td>\n<\/tr>\n<tr>\n<td>2<sup>21<\/sup><\/td>\n<td>16384 - 2097151<\/td>\n<td>1xxxxxxx 1xxxxxxx 0xxxxxxx<\/td>\n<\/tr>\n<tr>\n<td>2<sup>28<\/sup><\/td>\n<td>2097152 - 2,68\u00b710<sup>8<\/sup><\/td>\n<td>1xxxxxxx 1xxxxxxx 1xxxxxxx 0xxxxxxx<\/td>\n<\/tr>\n<tr>\n<td>2<sup>35<\/sup><\/td>\n<td>2,68\u00b710<sup>8<\/sup> - 3,44\u00b710<sup>10<\/sup><\/td>\n<td>1xxxxxxx 1xxxxxxx 1xxxxxxx 1xxxxxxx 0xxxxxxx<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Kodierung negativer Integer-Werte<\/h2>\n<p>Mit Hilfe eines Versatzes k\u00f6nnen negative Werte abgebildet werden. Der Offset kann beliebig gew\u00e4hlt werden. Er muss jedoch beim Kodieren und Dekodieren bekannt sein, da er sich nicht explizit aus dem Kodierungsverfahren ergibt. Ein Versatz eignet sich prinzipiell immer dann, wenn der Wertebereich nicht bei Null beginnt.<\/p>\n<p>Eine andere M\u00f6glichkeit negative Werte zu kodieren besteht darin, den Wert vorher in eine vorzeichenlose Zahl umzuwandeln. Die maximale Bitanzahl wird dadurch automatisch festgelegt. Aufgrund des f\u00fcr negative Zahlen immer gesetzten h\u00f6chstwertigen Bits wird beim Kodieren immer die maximale Anzahl Bytes ben\u00f6tigt. Vorzeichenbehaftete 32-Bit-Werte belegen daher immer 5 Byte.<\/p>\n<h2>Einsatzgebiete der variablen 7-Bit-Kodierung<\/h2>\n<p>Das variable 7-Bit-Kodierungsverfahren eignet sich insbesondere dann, wenn negative oder Werte gr\u00f6\u00dfer gleich 2<sup>28<\/sup> nur selten auftreten. Ein praktisches Einsatzgebiet ist die Serialisierung bzw. Deserialisierung von Zeichenketten, wenn hierbei als erstes die L\u00e4nge geschrieben bzw. gelesen wird. Die L\u00e4nge der Zeichenkette kann mit dem Verfahren effizient kodiert werden, da kleinere Werte wesentlich wahrscheinlicher sind als gr\u00f6\u00dfere.<\/p>\n<p>Das .NET Framework stellt beispielsweise zwei auf der variablen 7-Bit-Kodierung basierende Funktionen f\u00fcr 32-Bit-Werte bereit. Die Funktion Read7BitEncodedInt geh\u00f6rt zur Klasse System.IO.BinaryReader, die Funktion Write7BitEncodedInt zu System.IO.BinaryWriter. Allerdings sind beide Funktionen gesch\u00fctzt (protected), so dass sie nur durch abgeleitete Klassen genutzt werden k\u00f6nnen.<\/p>\n<h2>Implementierung f\u00fcr 32- und 64-Bit-Integer in C#<\/h2>\n<p>Die Bibliothek Liersch.Utilities enth\u00e4lt u.a. die Implementierung der variablen 7-Bit-Kodierung. Ein Modultest belegt die korrekte Funktion der Kodierung und Dekodierung.<\/p>\n<p>Die Bibliothek kann \u00fcber GitHub bezogen werden: <a href=\"https:\/\/github.com\/steffen-liersch\/Liersch.Utilities\">https:\/\/github.com\/steffen-liersch\/Liersch.Utilities<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die variable 7-Bit-Kodierung f\u00fcr Integer-Werte \u00e4hnelt der UTF-8-Kodierung. Je nach zu kodierendem Wert werden 1 bis n Byte belegt. Das h\u00f6chste Bit eines jeden Bytes gibt an, ob zur Abbildung eines Wertes ein weiteres Byte verwendet wurde.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[21,25,12,36,31],"class_list":["post-117","post","type-post","status-publish","format-standard","hentry","category-net","tag-net","tag-cs","tag-encoding","tag-open-source","tag-products"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/comments?post=117"}],"version-history":[{"count":27,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/117\/revisions"}],"predecessor-version":[{"id":683,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/117\/revisions\/683"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}