Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

GZIP specifikacija formata fajla verzija 4.3



Status ovog dopisa


Ovaj memorandum pruža informacije Internet zajednici. Ovaj memorandum nije specifikovao standarde Interneta bilo koje vrste.
Distribucija ovog memoranduma je neograničena..

IESG Napomena:


IESG ne zauzima nikakav stav o važnosti prava intelektualne svojine izveštaja sadržanih u ovom dokumentu.

Obaveštenja


Copyright (C) 1996 L. Peter Deutsch

Dozvoljeno je kopiranje i distribuiranje ovog dokumenta za bilo koju svrhu i bez naknade, uključujući i prevode na druge jezike i inkorporiranje u kompilacije, pod uslovom da su obaveštenje o autorskim pravima i ovo obaveštenje sačuvani, i da su svaka suštinska promena ili brisanje iz originala jasno označeni.

Pokazatelj na najnoviju verziju ovog i dokumentacije u HTML formatu možete naći na URL .

Sažetak


Ova specifikacija definiše sabijeni format podataka bez gubitaka koji je kompatibilan širokoj upotrebi GZIP koristi. Format uključuje cikličnu proveru viška vrednosti za otkrivanje podataka korupcije. Format trenutno koristi umanjeni metod kompresije, ali se lako može proširiti na druge metode korišćenja kompresije. Format može da se lako sprovede na način koji nije pokriven patentima.

1. Uvod


Svrha

Svrha ove specifikacije je da definiše da je kompresovan format bez gubitaka podataka:
  • Da je nezavisan od tipa procesora, operativnog sistema, fajl sistema i seta karaktera, pa stoga može da se koristi za razmenu,
  • Da se može kompresovati, ili dekompresovati tok podataka (kao nasuprot slučajno dostupnom fajlu) da proizvede još jedan tok podataka, koristeći samo jedan a priori ograničen iznos posrednog skladištenja, a samim tim može da se koristi u komunikaciji podataka ili sličnim strukturama kao što su Unix filteri;
  • Kompresuje podatke sa efikasnošću uporedivom sa trenutno najboljom dostupnom metodom kompresije opšte namene , a posebno znatno boljom od "compress" programa;
  • Može se lako sprovesti na način koji nije pokriven patentom, a samim tim se može slobodno praktikovati;
  • Kompatibilan je sa formatom proizvedenim od strane trenutno naširoko korišćene gzip korisnosti, u skladu sa tim dekompresori će moći da čitaju podatke proizvedene od postojećeg gzip kompresora.



Format podataka definisan od strane ove specifikacije ne pokušava da:
  • Obezbedi nasumični pristup kompresovanih podataka;
  • Kompresovane specijalizovane podatke (npr. rasterska grafika) kao i trenutno najbolje dostupne specijalizovane algoritme.


Planirana publika

Ova specifikacija je namenjena za upotrebu od strane implementatora za kompresiju podataka u gzip formatu i / ili dekompresiju podataka iz gzip formata.

Tekst specifikacije pretpostavlja osnovnu pozadinu u programiranju na nivou bita i drugih primitivnih podataka reprezentacije.

Obim

Specifikacija utvrđuje metod kompresije i format datoteke ( kasnije pretpostavljajući samo da datoteka može da skladišti niz proizvoljnih bajtova). To ne precizira nikakav poseban interfejs ka sistemu datoteka ili nešto o setu karaktera ili kodiranju (osim imena datoteka i komentare, koji su opcioni)

Saglasnost

Osim ako nije drugačije naznačeno u nastavku, usklađen dekompresor mora biti u stanju da prihvati i dekompresuje bilo koji fajl koji odgovara svim specifikacijama koje su ovde predstavljene, a kompresor mora proizvesti fajlove koji su u skladu sa svim specifikacijama koje su ovde predstavljene. Materijal u dodacima nije deo specifikacije po sebi i nije od značaja za usklađivanje..

Definicije termina i konvencije koje se koriste

bajt: 8 bita uskladištenih ili prenešenih kao jedinica (isto kao oktet) (Za ovu specifikaciju, bajt je tačno 8 bita, čak i na mašinama koje čuvaju karakter na broj bitova različitih od 8). Pogledajte ispod za numeraciju bitova unutar bajta.

1.6. Promene iz ranijih verzija

Nema nikakvih tehničkih promena na gzip formatu od verzije 4.1 ovoj specifikaciji. U verziji 4.2, neka terminologija je promenjena, a uzorak CRC koda je prepisan zbog jasnoće i eliminiše potrebu za pozivaoca da uradi uslovljavanje pre i posle. Verzija 4.3 je konverzija specifikacije RFC stila.

2..Detaljna specifikacija


Ukupna konvencija

U dijagramima ispod, ovakva kutija :

+ --- +
| | <- vertikalne="" šipke="" možda="" nedostaju="">
+ --- +

predstavlja jedan bajt; ovakva kutija:

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

predstavlja promenljivi broj bajtova.

Bajtovi uskladišteni u računaru nemaju "red bitova", oni se uvek tretiraju kao celina. Međutim, bajt koji se smatra celim brojem između 0 i 255 zaista ima najviše i najmanje značajan bit, a pošto pišemo brojeve sa najznačajnijim ciframa levo, takođe pišemo bajtove sa najznačajnim bitom pomalo levo. U dijagramima ispod, mi brojimo bitove jednog bajta, tako da je bit 0 najmanje značajan bit, odnosno, bitovi su odbrojani:

+--------+
|76543210|
+--------+

Ovaj dokument se ne bavi pitanjem redosleda kojim se bitovi bajta prenose na bit-sekvencijalni medijum, jer je format podataka ovde opisan radije kao bajt nego bit orijentisan.

Unutar računara, broj može zauzimati više bajtova. Svi višebajtni brojevi u formatu opisanom ovde se čuvaju sa najmanje značajanim bajtom prvo (u donjoj memorijskoj adresi). Na primer, decimalni broj 520 se skladišti kao:
0       1

+--------+--------+
|00001000|00000010|
+--------+--------+
^        ^
|        |

+ značajniji bajt = 2 x 256
+ manje značajan bajt = 8

Format fajla

Gzip fajl se sastoji od niza "članova" (kompresovanih skupova podataka). Format svakog člana je naveden u narednom delu. Članovi se jednostavno pojavljuju jedan za drugim u datoteci, bez dodatnih informacija pre, izmedju ili posle njih.

Format člana

Svaki član ima sledeću strukturu:

+---+---+---+---+---+---+---+---+---+---+
|ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
+---+---+---+---+---+---+---+---+---+---+

(if FLG.FEXTRA set)

+---+---+=================================+
| XLEN |...XLEN bytes of "extra field"...| (more-->)
+---+---+=================================+

(if FLG.FNAME set)

+=========================================+
|...original file name, zero-terminated...| (more-->)
+=========================================+

(if FLG.FCOMMENT set)
+===================================+
|...file comment, zero-terminated...| (more-->)
+===================================+

(if FLG.FHCRC set)

+---+---+
| CRC16 |
+---+---+

+=======================+
|...compressed blocks...| (more-->)
+=======================+

0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| CRC32 | ISIZE |
+---+---+---+---+---+---+---+---+

Član header-a i trailer-a

ID1 (identifikacija 1)
ID2 (identifikacija 2)
    Imaju fiksne vrednosti ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), da bi se identifikovao fajl koji je u gzip formatu.

CM (metod kompresije)
    Ovo identifikuje metod kompresije koji se koristi u datoteci. CM = 0-7 su rezervisane. CM = 8 označava "ispumpan" metod kompresije, što je onaj koji obično koristi gzip i koji je na drugim mestima dokumentovan.

FLG (zastavice)
    Ovaj bajt zastave se deli na pojedinačne bitove na sledeći način:.


bit 0 FTEXT
bit 1 FHCRC
bit 2 FEXTRA
bit 3 FNAME
bit 4 FCOMMENT
bit 5 reserved
bit 6 reserved
bit 7 reserved

Ako je FTEXT postavljen, fajl je verovatno ASCII tekst. Ovo je opciona indicija, koju kompresor može podesiti tako što će proveriti malu količinu ulaznih podataka da vidi da li su ne-ASCII karakteri prisutni. U slučaju sumnje, FTEXT je opozvan, ukazujući binarne podatke. Za sisteme koji imaju različite formate za ASCII tekst i binarne podatake, dekompresor može koristiti FText da izabere odgovarajući format. Mi namerno ne preciziramo algoritam koji se koristi da postavi ovaj bit, jer kompresor uvek ima opciju da ga ostavi očišćenog i dekompresor uvek ima opciju da ga ignoriše i pusti neke druge programe da upravljaju pitanjima konverzije podataka.

Ako je FHCRC podešen, CRC16 za gzip zaglavlje je prisutan, neposredno pre kompresovanih podataka. CRC16 se sastoji od dva najmanje značajna bajta CRC32 za sve bajtove gzip zaglavlja do njega i ne računajući CRC16. ( FHCRC bit nikada nije bio postavljen verzijama gzip-a sve do 1.2.4, iako je dokumentovan sa drugačijim značenjem u gzip 1.2.4.)

Ako je FEXTRA podešen, dodatna polja su prisutna, kao što je opisano u sledećem odeljku..

Ako je FNAME podešen, originalno ime fajla je prisutno, prekinuto nula bajtom. Ime se mora sastojati od ISO 8859-1 (Latin-1) karaktera, a na operativnim sistemima koji koriste EBCDIC ili bilo koji drugi znak koji je postavljen za imena fajlova, ime mora biti prevedeno na ISO Latin-1 set znakova. Ovo je originalni naziv datoteke koja se sabija uz bilo koje sklonjene komponente direktorijuma, i ako je fajl koji je kompresovan na fajl sistemu sa nesenzitivitetnim imenima, prinuđen na mala slovima. Nema originalnog imena fajla ako su podaci kompresovani iz drugog izvora a da nije imenovana datoteka, na primer, ako je izvor stdin na Unix sistemu, nema naziva fajla.

Ako je FCOMMENT podešen, nulom-prekinuti fajl je prisutan. Ovaj komentar nije interpretiran, već je namenjen samo za ljudsko korišćenje. Komentar se mora sastojati od ISO 8859-1 (Latin-1) karaktera. Redove treba označiti jednim karakterom linije (10 decimalnih).

Rezervisan FLG bita mora biti nula.

MTIME ( modifikacija vremena )
    Ovo daje najnoviju modifikaciju vremena originalne datoteke koja je kompresovana. Vreme je u Unix formatu, odnosno sekundama od 00:00:00 GMT, Jan 1, 1970. (Imajte na umu da ovo može izazvati probleme za MS-DOS i druge sisteme koji radije koriste lokalno nego univerzalno vreme.) Ako kompresovani podaci nisu došli iz datoteke, MTIME je podešen na vreme u kojem je počela kompresija. MTIME = 0 znači da nema pečata vremena na raspolaganju.

XFL (Extra zastavice)
    Ove zastave su dostupne za korišćenje određenih kompresionih metoda. "Ispumpavanje" metoda (CV = 8) postavlja ove zastave na sledeći način:

FL = 2 - kompresor koristi maksimalnu kompresiju,
    Najsporiji algoritam
XFL = 4 - kompresor koristi najbrži algoritam

OS (operativni sistem)
    Ovo identifikuje tip sistema datoteka na kojima se kompresija desila. Ovo može biti korisno u određivanju kraja linije konvencije za tekstualne fajlove. Trenutno definisane vrednosti su sledeće:


0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
1 - Amiga
2 - VMS (or OpenVMS)
3 - Unix
4 - VM/CMS
5 - Atari TOS
6 - HPFS filesystem (OS/2, NT)
7 - Macintosh
8 - Z-System
9 - CP/M
10 - TOPS-20
11 - NTFS filesystem (NT)
12 - QDOS
13 - Acorn RISCOS
255 - unknown

XLEN (extra dužina)
    Ako je FLG.FEXTRA podešen, ovo daje dužinu dodatnih polja. Pogledajte ispod za više detalja.
CRC32 (CRC-32)
    Ovo sadrži proveru vrednosti cikličnog viška nekompresovanih podataka prema CRC-32 algoritmu koji se koristi u ISO 3309 standardu i u odeljku 8.1.1.6.2 za ITU-T preporuku V. 42. (Videti http://www.iso.ch za naručivanje ISO dokumenata vidi :/ / gopher info.itu.ch za onlajn verziju ITU-T V.42..)
ISIZE ( veličina ulaza )
    Ovo sadrži veličinu originala (nekompresovanog) modula ulaznih podataka 2 ^ 32


Dodatno polje

Ako je FLG.FEXTRA bit postavljen, "extra polje" je prisutno u zaglavlju, sa kompletnim bajtovima dužine Xlen. Ono se sastoji od niza podoblasti, svakom od formi:

+---+---+---+---+==================================+
|SI1|SI2| LEN |... LEN bytes of subfield data ...|
+---+---+---+---+==================================+

SI1 i SI2 obezbeđuju potpolje ID, obično dva ASCII slova sa nekim Mnemonic vrednostima. Jean-Loup Gailly održava registar potpolja lD-a; pošaljite mu bilo koje ID potpolje koje želite da koristite. Potpolja ID sa SI2 = 0 su rezervisana za buduću upotrebu. Sledeći ID-ovi su trenutno definisani:

SI1         SI2         Data
----------  ----------  ----
0x41 ('A')  0x70 ('P')  Apollo file type information
LEN gives the length of the subfield data, excluding the 4 initial bytes.

LEN daje dužinu potpolja podataka, izuzev inicijalnih 4 bajta.

Saglasnost

Usklađen kompresor mora proizvesti fajlove sa ispravnim ID1, ID2, CM, CRC32 i ISIZE, ali može podesiti sva ostala polja fiksne dužine dela zaglavlja na podrazumevane vrednosti (255 za OS, 0 za sve ostale). Kompresor mora podesiti sve rezervisane bitove na nulu.

Usklađen dekompresor mora da proveri ID1, ID2 i CM, i da daje indikaciju greške ako neko od njih ima netačne vrednosti. On mora ispitati FEXTRA / XLEN, FNAME, FCOMMENT i FHCRC barem tako da možete da preskočite preko opcionih polja, ako su prisutni. Nije potrebno ispitati bilo koji drugi deo headera-a ili trailer-a, posebno dekompresor može ignorisati FTEXT i OS i uvek proizvoditi binarni izlaz, a i dalje biti usaglašen. Usaglašen dekompresor mora dati indikaciju greške ukoliko bilo koji rezervisan bit nije nula, jer bi takav bit mogao da ukazuje na prisustvo novog polja koje bi izazvalo da naredni podaci budu pogrešno tumačeni.

3..Literatura


[1] "Information Processing - 8-bit single-byte coded graphic sets - Deo 1: Latin No.1" (ISO 8859-1:1987). ISO 8859-1 (Latin-1) skup znakova superseta 7-bitnog ASCII-a. Fajlovi koji definišu ovaj skup znakova su dostupni kao iso_8859-1. * u ftp://ftp.uu.net/graphics/png/documents/

[2] ISO 3309

[3] ITU-T recommendation V.42

[4] Deutsch, L. P. "DEFLATE Compressed Data Format Specification", dostupan u ftp://ftp.uu.net/pub/archiving/zip/doc/

[5] Gailly, J.-L., GZIP dokumentacija dostupna kao gzip- *. tar u ftp://prep.ai.mit.edu/pub/gnu/

[6] Sarwate, D. V., "Computation of Cyclic Redundancy Checks via Table Look-Up ", Communications of the ACM, 31 (8), str 1008-1013.

[7] Schwaderer, W. D., “CRC Calculation” -"CRC Obračun", April 85. PC Tech Journal, str 118-133.

[8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3 txt, koji opisuje CRC koncept.

4. Bezbednosna Razmatranja


Bilo koji metod kompresije podataka podrazumeva smanjenje viška u podacima. Prema tome, bilo koja korupcija podataka je verovatna da će imati ozbiljne posledice i biti teška da se ispravi. Nekompresovani tekst, s druge strane, verovatno će i dalje biti čitljiv, uprkos prisustvu nekih oštećenih bajtova. Preporučuje se da sistemi koji koriste ovaj format podataka obezbede neka sredstva potvrđivanja integriteta kompresovanih podataka, kao što je postavljanje i provera CRC-32 za potvrdu vrednosti.

5. Priznanja


Robne marke navedene u ovom dokumentu su vlasništvo njihovih cenjenih vlasnika.

Žan-Lup Gaili dizajnirao je gzip format i napisao sa Markom Adlerom, odgovarajući softver opisan u ovoj specifikaciji. Glenn Randers-Pehrson pretvorio je ovaj dokument u RFC i HTML format.

6..Adresa autora


L. Peter Deutsch

Aladdin Enterprises
203 Santa Margarita Ave
Menlo Park, CA 94025

Telefon: (415) 322-0103 (prepodne samo)
Faks: (415) 322-1734
E-mail adresa:

Pitanja o tehničkom sadržaju ove specifikacije mogu biti poslata poštom na:

Žan-Loup Gailli i
Mark Adler

Komentari redakcije na ovu specifikaciju mogu biti poslati elektronskom poštom na:

L. Peter Deutsch i
Glenn Randers-Pehrson

7. Dodatak: Jean-Loup Gailly - gzip korisnost


Najrasprostranjeniju primenu gzip kompresije, i original dokumentaciju na kojoj se zasniva ova specifikacija, stvorio je Žan-Lup Gaili . Pošto je implementacija de fakto standard, moramo pomenuti još neke od karakteristika ovde. Opet, materijal u ovom odeljku nije deo specifikacije po sebi, a implementacije ne treba da ga slede da bi bile usklađene.

Kada kompresujemo ili dekompresujemo datoteke, gzip čuva zaštitu, vlasništvo i atribute vremena modifikacije na lokalnom sistemu jer ne postoji odredba za zastupanje zaštite atributa u samom gzip formatu. Pošto format uključuje modifikaciju vremena, gzip dekompresor pruža prekidač komandne linije koji dodeljuje modifikaciju vremena iz datoteke, a ne lokalno vreme modifikacije kompresovanog ulaza, do izlaza dekompresije.

8..Dodatak: Primer CRC koda


Sledeći uzorak koda predstavlja praktičnu primenu CRC-a (Cyclic Redundancy Check). (Vidi takođe ISO 3309 i ITU-T V.42 za formalnu specifikaciju.)

Uzorak koda je u ANSI C programskom jeziku. Oni koji nisu C korisnici mogu lakše da čitaju sa ovim savetima:

&      Bitwise AND operator.
^      Bitwise exclusive-OR operator.
>>     Bitwise right shift operator. When applied to an
       unsigned quantity, as here, right shift inserts zero
       bit(s) at the left.
!      Logical NOT operator.
++     "n++" increments the variable n.
0xNNN  0x introduces a hexadecimal (base 16) constant.
       Suffix L indicates a long value (at least 32 bits).

/* Table of CRCs of all 8-bit messages. */
unsigned long crc_table[256];

/* Flag: has the table been computed? Initially false. */
int crc_table_computed = 0;

/* Make the table for a fast CRC. */
void make_crc_table(void)
{
  unsigned long c;
  int n, k;

  for (n = 0; n < 256; n++) {
    c = (unsigned long) n;
    for (k = 0; k < 8; k++) {
      if (c & 1) {
        c = 0xedb88320L ^ (c >> 1);
      } else {
        c = c >> 1;
      }
    }
    crc_table[n] = c;
  }
  crc_table_computed = 1;
}

/*
   Update a running crc with the bytes buf[0..len-1] and return
 the updated crc. The crc should be initialized to zero. Pre- and
 post-conditioning (one's complement) is performed within this
 function so it shouldn't be done by the caller. Usage example:

   unsigned long crc = 0L;

   while (read_buffer(buffer, length) != EOF) {
     crc = update_crc(crc, buffer, length);
   }
   if (crc != original_crc) error();
*/
unsigned long update_crc(unsigned long crc,
                unsigned char *buf, int len)
{
  unsigned long c = crc ^ 0xffffffffL;
  int n;

  if (!crc_table_computed)
    make_crc_table();
  for (n = 0; n < len; n++) {
    c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
  }
  return c ^ 0xffffffffL;
}

/* Return the CRC of the bytes buf[0..len-1]. */
unsigned long crc(unsigned char *buf, int len)
{
  return update_crc(0L, buf, len);
}





Published (Last edited): 11-02-2013 , source: http://linux.vbird.org/linux_basic/0240tarcompress/0240tarcompress_gzip.php