You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Linux</strong> <strong>i386</strong> <strong>Önyükleme</strong> <strong>Kodu</strong> <strong>NASIL</strong><br />
00 – sıkı¸stırma yok<br />
bayt sınırına kadar kalan bitler;<br />
LEN (2 bayt);<br />
NLEN (2 bayt, LEN’in tamamlayıcısı);<br />
data (LEN bayt);<br />
01 – düzeltilmi¸s Huffman kodu ile sıkı¸stırılmı¸s<br />
{<br />
literal (7–9 bitleri, 256 hariç 0..287 kodunu temsil eder);<br />
// Bakınız RFC 1951, 3.2.6 paragrafındaki tablo.<br />
length (0–5 bitleri, literal > 256 ise 3..258 arasında bir uzunluktur);<br />
// Bkz. RFC 1951, 3.2.5 paragrafındaki 1. alfabe tablosu.<br />
data (literal < 256 ise literal baytlarının verileri);<br />
distance (literal == 257..285 ise 5 artı 0–13 ek bit,<br />
1..32768 arasında bir mesafe belirtir;<br />
/* Bakınız RFC 1951, 3.2.5 paragrafındaki 2. alfabe tablosu,<br />
* 3.2.6 paragrafındaki deyim de˘gil*/<br />
/* Çıktı akımında "distance" bayt geri git<br />
* ve "length" baytı kopyala. */<br />
}* // çok sayıda örnek olabilir<br />
literal (7 bit, tümü 0, literal == 256, blok sonu belirtir);<br />
10 – Dinamik Huffman koduyla sıkı¸stırılmı¸s<br />
HLIT (5 bit, Literal/Length kodlarının sayısı – 257, 257–286);<br />
HDIST (5 bit, Distance kodlarının sayısı – 1, 1–32);<br />
HCLEN (4 bit, Code Length kodlarının sayısı – 4, 4 – 19);<br />
Code Length dizisi ((HCLEN+4)*3 bit)<br />
/* A¸sa˘gıdaki 2 alfabe tablosu, önceki Code Length dizisinden üretilen<br />
* Huffman kod çözme tablosu kullanılarık çözülecektir. */<br />
Literal/Length alfabesi (HLIT+257 kod)<br />
Distance alfabesi (HDIST+1 kod)<br />
// Kod çözme tabloları bu alfabe tablolarından olu¸sturur.<br />
/* A¸sa˘gıdaki, farklı kod çözme tabloları kullanmak dı¸sında düzeltilmi¸s<br />
* Huffman kodları kısmı ile benzerlik gösterir. */<br />
{<br />
literal/length<br />
(de˘gi¸sken uzunluk, Literal/Length alfabesine ba˘gımlı);<br />
data (literal < 256 ise literal baytlarının verisi);<br />
distance (literal == 257..285 ise de˘gi¸sken uzunlukta,<br />
Distance alfabesine ba˘gımlı);<br />
}* // çok sayıda örnek olabilir<br />
literal (literal de˘geri 256, blok sonu anlamında);<br />
11 – reserved (hata)<br />
Dikkat ederseniz Huffman kodları MSB’den ba¸slarken, veri elemanları En–De˘gersiz–Bit’ten (Least–Significant<br />
Bit – LSB) ba¸slayıp En–De˘gerli–Bit’e (Most–Significant Bit – MSB) kadar byte’ları paketler. Ayrıca literal<br />
de˘gerleri 286–287 ve distance kodları 30–31’in asla olu¸smayaca˘gına dikkat edin.<br />
RFC 1951 ve yukarıdaki veri yapısı elinizdeyken inflate_block() i¸slevini anlamak çok da zor olmayacaktır.<br />
Huffman kodlaması ve alfabe tablosu üretimi için RFC 1951 içindeki ilgili paragraflara ba¸svurunuz.<br />
Daha fazla ayrıntı için linux/lib/inflate.c belgesine, gzip kaynak koduna (bir çok yorum satırı var) ve<br />
ilgili ba¸svuru materyallerine bakınız.<br />
http://belgeler.org <strong>Linux</strong> Kitaplı˘gı 38 / 77