Rev 1149 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1149 | Rev 6673 | ||
---|---|---|---|
1 | archiver.obj ýêñïîðòèðóåò äâå ôóíêöèè äëÿ ðàñïàêîâêè deflate-äàííûõ. |
1 | archiver.obj ýêñïîðòèðóåò äâå ôóíêöèè äëÿ ðàñïàêîâêè deflate-äàííûõ. |
- | 2 | À òàêæå ôóíêöèè: deflateInit, deflateInit2, deflateReset, deflate, |
|
- | 3 | deflateEnd äëÿ óïàêîâêè deflate-äàííûõ, ñäåëàííûå íà îñíîâå ñâîáîäíî |
|
- | 4 | ðàñïðîñòðàíÿåìîé áèáëèîòåêè zlib. |
|
2 | 5 | ||
3 | Ïåðâàÿ: deflate_unpack |
6 | Ïåðâàÿ: deflate_unpack |
4 | Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack(const void* data, unsigned* pLength); |
7 | Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack(const void* data, unsigned* pLength); |
5 | Àðãóìåíòû: |
8 | Àðãóìåíòû: |
6 | data - óêàçàòåëü íà óïàêîâàííûå äàííûå |
9 | data - óêàçàòåëü íà óïàêîâàííûå äàííûå |
7 | pLength - óêàçàòåëü íà ïåðåìåííóþ äëèíû: |
10 | pLength - óêàçàòåëü íà ïåðåìåííóþ äëèíû: |
8 | íà âõîäå *pLength äîëæíî ñîäåðæàòü äëèíó âõîäíûõ äàííûõ data, |
11 | íà âõîäå *pLength äîëæíî ñîäåðæàòü äëèíó âõîäíûõ äàííûõ data, |
9 | íà âûõîäå *pLength çàïîëíèòñÿ äëèíîé âûõîäíûõ äàííûõ |
12 | íà âûõîäå *pLength çàïîëíèòñÿ äëèíîé âûõîäíûõ äàííûõ |
10 | Âîçâðàùàåìîå çíà÷åíèå: |
13 | Âîçâðàùàåìîå çíà÷åíèå: |
11 | óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè |
14 | óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè |
12 | ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé |
15 | ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé |
13 | ôóíêöèåé 68.13 |
16 | ôóíêöèåé 68.13 |
14 | Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà: |
17 | Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà: |
15 | ; ïóñòü esi = óêàçàòåëü íà äàííûå, ecx = äëèíà óïàêîâàííûõ äàííûõ |
18 | ; ïóñòü esi = óêàçàòåëü íà äàííûå, ecx = äëèíà óïàêîâàííûõ äàííûõ |
16 | push ecx ; ïåðåìåííàÿ *pLength áóäåò â ñòåêå |
19 | push ecx ; ïåðåìåííàÿ *pLength áóäåò â ñòåêå |
17 | push esp ; à âîò è óêàçàòåëü íà íå¸ pLength |
20 | push esp ; à âîò è óêàçàòåëü íà íå¸ pLength |
18 | push esi ; à ýòî äàííûå |
21 | push esi ; à ýòî äàííûå |
19 | call [deflate_unpack] |
22 | call [deflate_unpack] |
20 | pop ecx ; âûòîëêíåì èç ñòåêà ïåðåìåííóþ *pLength |
23 | pop ecx ; âûòîëêíåì èç ñòåêà ïåðåìåííóþ *pLength |
21 | ; äâà àðãóìåíòà âûòîëêíåò ñàìà deflate_unpack |
24 | ; äâà àðãóìåíòà âûòîëêíåò ñàìà deflate_unpack |
22 | ; òåïåðü eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = èõ äëèíà |
25 | ; òåïåðü eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = èõ äëèíà |
23 | 26 | ||
24 | Âòîðàÿ: deflate_unpack2 |
27 | Âòîðàÿ: deflate_unpack2 |
25 | Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack2(const void* get_next_chunk, void* parameter, unsigned* pUnpackedLength); |
28 | Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack2(const void* get_next_chunk, void* parameter, unsigned* pUnpackedLength); |
26 | void* __stdcall get_next_chunk(void* parameter, unsigned* pLength); |
29 | void* __stdcall get_next_chunk(void* parameter, unsigned* pLength); |
27 | Àðãóìåíòû: |
30 | Àðãóìåíòû: |
28 | get_next_chunk - óêàçàòåëü íà ôóíêöèþ, âîçâðàùàþùóþ óêàçàòåëü è äëèíó |
31 | get_next_chunk - óêàçàòåëü íà ôóíêöèþ, âîçâðàùàþùóþ óêàçàòåëü è äëèíó |
29 | î÷åðåäíîãî áëîêà óïàêîâàííûõ äàííûõ; êîãäà äàííûå |
32 | î÷åðåäíîãî áëîêà óïàêîâàííûõ äàííûõ; êîãäà äàííûå |
30 | çàêàí÷èâàþòñÿ, äîëæíà âîçâðàùàòü NULL (ïðè êîððåêòíûõ |
33 | çàêàí÷èâàþòñÿ, äîëæíà âîçâðàùàòü NULL (ïðè êîððåêòíûõ |
31 | óïàêîâàííûõ äàííûõ òàêîé ñèòóàöèè íå ìîæåò áûòü â ïðèíöèïå, |
34 | óïàêîâàííûõ äàííûõ òàêîé ñèòóàöèè íå ìîæåò áûòü â ïðèíöèïå, |
32 | ïðè íåêîððåêòíûõ äàííûõ åñëè ôóíêöèÿ âåðíóëà NULL, òî |
35 | ïðè íåêîððåêòíûõ äàííûõ åñëè ôóíêöèÿ âåðíóëà NULL, òî |
33 | äàëüíåéøèõ âûçîâîâ íå áóäåò) |
36 | äàëüíåéøèõ âûçîâîâ íå áóäåò) |
34 | parameter - ñóùíîñòü, êîòîðàÿ íå èñïîëüçóåòñÿ ñàìèì ðàñïàêîâùèêîì |
37 | parameter - ñóùíîñòü, êîòîðàÿ íå èñïîëüçóåòñÿ ñàìèì ðàñïàêîâùèêîì |
35 | è áåç èçìåíåíèé ïåðåäà¸òñÿ â get_next_chunk |
38 | è áåç èçìåíåíèé ïåðåäà¸òñÿ â get_next_chunk |
36 | (åñëè callback-ôóíêöèè îíà òîæå íå íóæíà, ìîæíî ïåðåäàâàòü |
39 | (åñëè callback-ôóíêöèè îíà òîæå íå íóæíà, ìîæíî ïåðåäàâàòü |
37 | â ýòîì ïàðàìåòðå âñ¸, ÷òî óãîäíî) |
40 | â ýòîì ïàðàìåòðå âñ¸, ÷òî óãîäíî) |
38 | pUnpackedLength - óêàçàòåëü íà ïåðåìåííóþ, êóäà áóäåò çàïèñàíà |
41 | pUnpackedLength - óêàçàòåëü íà ïåðåìåííóþ, êóäà áóäåò çàïèñàíà |
39 | äëèíà ðàñïàêîâàííûõ äàííûõ |
42 | äëèíà ðàñïàêîâàííûõ äàííûõ |
40 | Âîçâðàùàåìîå çíà÷åíèå: |
43 | Âîçâðàùàåìîå çíà÷åíèå: |
41 | óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè |
44 | óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè |
42 | ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé |
45 | ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé |
43 | ôóíêöèåé 68.13 |
46 | ôóíêöèåé 68.13 |
44 | Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà: |
47 | Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà: |
45 | push eax ; âûäåëÿåì â ñòåêå ïåðåìåííóþ äëÿ *pUnpackedLength |
48 | push eax ; âûäåëÿåì â ñòåêå ïåðåìåííóþ äëÿ *pUnpackedLength |
46 | ; ïîñêîëüêó çíà÷åíèå íåâàæíî, êîðî÷å è áûñòðåå âñåãî |
49 | ; ïîñêîëüêó çíà÷åíèå íåâàæíî, êîðî÷å è áûñòðåå âñåãî |
47 | ; ñäåëàòü ýòî îäíîáàéòîâûì push <ðåãèñòð> |
50 | ; ñäåëàòü ýòî îäíîáàéòîâûì push <ðåãèñòð> |
48 | push esp ; à âîò è ñàì óêàçàòåëü pUnpackedLength |
51 | push esp ; à âîò è ñàì óêàçàòåëü pUnpackedLength |
49 | push esi ; êàêîé-íèáóäü ïàðàìåòð |
52 | push esi ; êàêîé-íèáóäü ïàðàìåòð |
50 | push deflate_callback |
53 | push deflate_callback |
51 | call [deflate_unpack2] |
54 | call [deflate_unpack2] |
52 | pop ecx ; âûòàëêèâàåì UnpackedLength |
55 | pop ecx ; âûòàëêèâàåì UnpackedLength |
53 | ; êàê è â ïåðâîì ñëó÷àå, eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = ðàçìåð |
56 | ; êàê è â ïåðâîì ñëó÷àå, eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = ðàçìåð |
54 | 57 | ||
55 | ... |
58 | ... |
56 | 59 | ||
57 | ; à ýòî ôóíêöèÿ ïîëó÷åíèÿ ñëåäóþùåãî êóñêà óïàêîâàííûõ äàííûõ |
60 | ; à ýòî ôóíêöèÿ ïîëó÷åíèÿ ñëåäóþùåãî êóñêà óïàêîâàííûõ äàííûõ |
58 | deflate_callback: |
61 | deflate_callback: |
59 | ; åñëè íóæåí ïàðàìåòð, òî äîñòàòü åãî ìîæíî òàê: |
62 | ; åñëè íóæåí ïàðàìåòð, òî äîñòàòü åãî ìîæíî òàê: |
60 | ; mov esi, [esp+4] ; esi = ïàðàìåòð |
63 | ; mov esi, [esp+4] ; esi = ïàðàìåòð |
61 | ; òóò êàêèå-òî äåéñòâèÿ |
64 | ; òóò êàêèå-òî äåéñòâèÿ |
62 | ; è âîò ðåçóëüòàò |
65 | ; è âîò ðåçóëüòàò |
63 | mov ecx, [esp+8] ; â [ecx] íóæíî çàïèñàòü äëèíó |
66 | mov ecx, [esp+8] ; â [ecx] íóæíî çàïèñàòü äëèíó |
64 | mov [ecx], length |
67 | mov [ecx], length |
65 | mov eax, buffer |
68 | mov eax, buffer |
66 | ret 8ðåãèñòð> |
69 | ret 8 |
- | 70 | ||
- | 71 | Àëãîðèòì äëÿ óïàêîâêè äàííûõ: |
|
- | 72 | 1) Âûçîâ ôóíêöèè deflateInit èëè deflateInit2. |
|
- | 73 | 2) Ðàçáèåíèå âõîäíîãî ïîòîêà äàííûõ íà ïîðöèè ïî 64 Êá. |
|
- | 74 | Äëÿ êàæäîãî áëîêà â 64 Êá â öèêëå äîëæåí äåëàòüñÿ âûçîâ ôóíêöèè deflate. |
|
- | 75 | Çà îäèí âûçîâ ôóíêöèè deflate ñæàòûõ äàííûõ îáðàçóåòñÿ íå áîëåå 16 Êá. |
|
- | 76 | Ò. å. åñëè ñæèìàåìûõ äàííûõ ìåíåå 16 Êá, òî èõ ìîæíî óïàêîâàòü çà îäèí âûçîâ deflate. |
|
- | 77 | Åñëè ñæèìàåìûõ äàííûõ ìåíåå 64 Êá, òî èõ ìîæíî óïàêîâàòü îðãàíèçîâàâ îäèí öèêë ñ âûçîâîì deflate. |
|
- | 78 | Åñëè ñæèìàåìûõ äàííûõ áîëåå 64 Êá, òî èõ ìîæíî óïàêîâàòü îðãàíèçîâàâ äâîéíîé öèêë ñ âûçîâîì deflate. |
|
- | 79 | 3) Âûçîâ ôóíêöèè deflateEnd äëÿ î÷èñòêè ïàìÿòè. |
|
- | 80 | Çàìå÷àíèÿ: |
|
- | 81 | Áîëüøèå óðîâíè ñæàòèÿ ïîêà ÷òî íå ïîääåðæèâàþòñÿ. |
|
- | 82 | Ôóíêöèÿ deflate íå êîðåêòíî ðàáîòàåò ñ ïàðàìåòðîì Z_NO_FLUSH. |
|
- | 83 | (Ïîêà ïðîáëåìà íå óñòðàíåíà ðåêîìåíäóåòñÿ âñåãäà ñòàâèòü Z_FINISH)ðåãèñòð> |