» ZLIB Compressed Data Format Specification (RFC 1950)

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Specifikation av ZLIB:s komprimerade dataformat, version 3.3

Status för detta dokument

Detta dokument tillhandahåller information för internetgemenskapen. Dokumentet specificerar inte någon internetstandard. Distributionen av detta dokument är obegränsad.

IESG-anteckning

IESG tar ingen ställning till giltigheten av några uttalanden om immateriella rättigheter som nämns i detta dokument.

Meddelanden

Upphovsrätt (c) 1996 av L. Peter Deutsch och Jean-Loup Gailly

Tillstånd ges att kopiera och distribuera detta dokument för alla ändamål och utan kostnad, inklusive översättningar till andra språk och inkludering i samlingar, förutsatt att upphovsrättsmeddelandet och detta meddelande bibehålls, och att eventuella väsentliga ändringar eller borttagningar från originalet tydligt anges.

En länk till den senaste versionen av detta och relaterad dokumentation i HTML-format finns på: <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>

Sammanfattning

Denna specifikation definierar ett förlustfritt komprimerat dataformat. Data kan produceras eller användas, även för en godtyckligt lång sekventiell datainmatning, med endast en på förhand begränsad mängd mellanlagringsutrymme.

Formatet använder för närvarande kompressionsmetoden DEFLATE, men kan enkelt utökas för att använda andra kompressionsmetoder. Det kan implementeras utan att omfattas av patent.

Denna specifikation definierar även ADLER-32-checksumman (en utökning och förbättring av Fletcher-checksumman) som används för att upptäcka datakorruption, och tillhandahåller en algoritm för att beräkna den.

Innehållsförteckning

  1. Introduktion
    1. Syfte
    2. Avsedd målgrupp
    3. Omfattning
    4. Överensstämmelse
    5. Definitioner av termer och konventioner
    6. Ändringar från tidigare versioner
  2. Detaljerad specifikation
    1. Allmänna konventioner
    2. Dataformat
    3. Efterlevnad
  3. Referenser
  4. Källkod
  5. Säkerhetsaspekter
  6. Tack och erkännanden
  7. Författarnas kontaktuppgifter
  8. Bilaga: Motivering
  9. Bilaga: Exempelkod

Introduktion

Syfte

Syftet med denna specifikation är att definiera ett förlustfritt komprimerat dataformat som:

  • Är oberoende av CPU-typ, operativsystem, filsystem och teckenkodning, och därmed kan användas för utbyte.
  • Kan produceras eller användas, även för en godtyckligt lång sekventiell datainmatning, med endast en på förhand begränsad mängd mellanlagringsutrymme, och därmed kan användas i datakommunikation eller liknande strukturer såsom Unix-filter.
  • Kan använda flera olika kompressionsmetoder.
  • Kan implementeras på ett sätt som inte omfattas av patent, och därmed kan användas fritt.

Dataformatet som definieras i denna specifikation försöker inte tillåta slumpmässig åtkomst till komprimerade data.

Avsedd målgrupp

Denna specifikation är avsedd för utvecklare av mjukvara för att komprimera data i zlib-format och/eller dekomprimera data från zlib-format. Texten förutsätter grundläggande kunskaper i programmering på bitnivå och andra primitiva datarepresentationer.

Omfattning

Specifikationen definierar ett komprimerat dataformat som kan användas för minnesintern komprimering av en sekvens av godtyckliga bytes.

Överensstämmelse

Om inte annat anges nedan, måste en kompatibel dekompressor kunna acceptera och dekomprimera vilken dataset som helst som uppfyller alla specifikationer här; en kompatibel kompressor måste producera datasets som uppfyller alla specifikationer här.

Definitioner av termer och konventioner

  • byte: 8 bitar lagrade eller överförda som en enhet (samma som en oktett). För denna specifikation är en byte exakt 8 bitar, även på maskiner som lagrar en teckenrepresentation med fler eller färre bitar.

Ändringar från tidigare versioner

  • Version 3.1 var den första offentliga versionen av denna specifikation.
  • I version 3.2 ändrades terminologi och Adler-32-exempelkoden skrevs om för tydlighet.
  • I version 3.3 infördes stöd för ett förinställt ordförråd, och specifikationen omarbetades till RFC-format.

Detaljerad specifikation

Allmänna konventioner

Diagram används för att representera bytes och strukturer. Till exempel:

En byte representeras som:

+---+
|   |
+---+

Och en variabel mängd bytes representeras som:

+==============+
|              |
+==============+

Dataformat

Ett zlib-flöde har följande struktur:

0   1
+---+---+
|CMF|FLG|   (mer -->)
+---+---+

Om flaggan FLG.FDICT är satt:

0   1   2   3
+---+---+---+---+
|     DICTID    |   (mer -->)
+---+---+---+---+
+=====================+---+---+---+---+
|...komprimerad data...|    ADLER32    |
+=====================+---+---+---+---+

Referenser

  • [1] Deutsch, L.P., "GZIP Compressed Data Format Specification".
  • [2] Thomas Boutell, "PNG (Portable Network Graphics) specification".
  • [3] Deutsch, L.P., "DEFLATE Compressed Data Format Specification".
  • [4] Fletcher, J.G., "An Arithmetic Checksum for Serial Transmissions".
  • [5] ITU-T Recommendation X.224, Annex D.

Källkod

Källkod för en C-implementering av ett bibliotek som följer zlib-format finns på: <ftp://ftp.uu.net/pub/archiving/zip/zlib/>.

Säkerhetsaspekter

En dekompressor som misslyckas med att kontrollera ADLER-32-checksumman kan bli utsatt för oupptäckt datakorruption.

Tack och erkännanden

Varumärken som nämns i detta dokument tillhör sina respektive ägare.

Jean-Loup Gailly och Mark Adler designade zlib-formatet och skrev den relaterade mjukvaran som beskrivs i denna specifikation. Glenn Randers-Pehrson konverterade detta dokument till RFC- och HTML-format.

Författarnas kontaktuppgifter

L. Peter Deutsch Aladdin Enterprises 203 Santa Margarita Ave. Menlo Park, CA 94025 Telefon: (415) 322-0103 (FM endast) E-post: <ghost@aladdin.com>

Jean-Loup Gailly E-post: <gzip@prep.ai.mit.edu>

Bilaga: Motivering

      1. Adler-32-algoritmen

Adler-32-algoritmen är mycket snabbare än CRC32 men ger ändå en extremt låg sannolikhet för oupptäckta fel.

Bilaga: Exempelkod

Följande kod är en C-implementering av Adler-32-algoritmen:

#define BASE 65521 /* största primtalet mindre än 65536 */

unsigned long update_adler32(unsigned long adler, unsigned char *buf, int len) {
    unsigned long s1 = adler & 0xffff;
    unsigned long s2 = (adler >> 16) & 0xffff;
    for (int n = 0; n < len; n++) {
        s1 = (s1 + buf[n]) % BASE;
        s2 = (s2 + s1) % BASE;
    }
    return (s2 << 16) + s1;
}