enLZ77 LZ77 ºÎÈ£ deLZ77 LZ77 ºÎÈ£·ÎºÎÅÍÀÇ º¹È£
LZ77 ºÎÈ£
long enLZ77(unsigned char *code, long clen,
unsigned char *text, long tlen);
LZ77 ºÎÈ£·ÎºÎÅÍÀÇ º¹È£
long deLZ77(unsigned char *text, long tlen,
unsigned char *code, long clen);
LZ77 ºÎÈ£ ÇÔ¼ö¿¡ ´ëÇØ
code (ÀÔÃâ·Â) LZ77 ºÎÈ£¸¦ °Ý³³ÇÏ´Â ¹è¿
clen (ÀÔ·Â) ¹è¿ codeÀÇ ±æÀÌ
text (ÀÔ·Â) ÅØ½ºÆ®¸¦ °Ý³³ÇÏ´Â ¹è¿
tlen (ÀÔ·Â) ¹è¿ textÀÇ ±æÀÌ
LZ77 ºÎÈ£·ÎºÎÅÍÀÇ º¹È£ ÇÔ¼ö¿¡ ´ëÇØ
text (ÀÔÃâ·Â) ÅØ½ºÆ®¸¦ °Ý³³ÇÏ´Â ¹è¿
tlen (ÀÔ·Â) ¹è¿ textÀÇ ±æÀÌ
code (ÀÔ·Â) LZ77 ºÎÈ£¸¦ °Ý³³ÇÏ´Â ¹è¿
clen (ÀÔ·Â) ¹è¿ codeÀÇ ±æÀÌ
LZ77 ºÎÈ£ ÇÔ¼ö¿¡ ´ëÇØ
LZ77 ºÎÈ£ÀÇ ±æÀÌ. encode¿¡ ½ÇÆÐÇßÀ» ¶§´Â -1L.
LZ77 ºÎÈ£·ÎºÎÅÍÀÇ º¹È£ ÇÔ¼ö¿¡ ´ëÇØ
ÅØ½ºÆ®ÀÇ ±æÀÌ. º¹È£¿¡ ½ÇÆÐÇßÀ» ¶§´Â -1L.
#define F 128 /* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ ±æÀÌÀÇ »óÇÑ */
#define LOG2F 7 /* 2^7 = 128 */
#define N0 4096
#define LOG2N 12 /* 2^12 = 4096 */
#define N (N0+F) /* ½½¶óÀ̵åâÀÇ Å©±â */
long enLZ77(unsigned char *code, long clen,
unsigned char *text, long tlen)
{
int i, j;
int w, l, x;
int ww, ll;
long len;
unsigned char *wintop, *winbrk;
unsigned char *texttop, *textend;
unsigned char prewin[N0];
static int bit0[12] =
{~1,~2,~4,~8,~16,~32,~64,~128,~256,~512,~1024,~2048};
static int bit1[12] =
{ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
for (i = 0; i < N0; i++) prewin[i] = 0;
wintop = prewin; winbrk = wintop + N0;
texttop = text; textend = text + tlen;
for (i = 7, len = 0; ; ) {
unsigned char *wp;
if (texttop >= textend) break;
/* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀ» ã¾Æ³½´Ù */
w = l = 0;
for (wp = wintop, ww = 0; ww < N0; ww++) {
if (wp == winbrk) wp = text;
if (*wp++ == *texttop) {
unsigned char *p, *q;
for (p = wp, q = texttop+1, ll = 1; ll < F; ll++) {
if (p == winbrk) p = text;
if (q == textend || *p++ ! = *q++) {
if (ll >= l) {
w = ww;
l = ll;
}
break;
}
}
}
}
x = *(texttop + l);
/* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ °³½Ã À§Ä¡¸¦ Ãâ·Â */
for (j = LOG2N-1; j >= 0; j--) {
if (w & bit1[j]) *code |= bit1[i];
else *code &= bit0[i];
if (i-- == 0) {
code++;
if (++len > clen) return -1L;
i = 7;
}
}
/* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ ±æÀ̸¦ Ãâ·Â */
for (j = LOG2F-1; j >= 0; j--) {
if (l & bit1[j]) *code |= bit1[i];
else *code &= bit0[i];
if (i-- == 0) {
code++;
if (++len > clen) return -1L;
i = 7;
}
}
/* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ ´ÙÀ½ÀÇ ¹®ÀÚ¸¦ Ãâ·Â */
for (j = 7; j >= 0; j--) {
if (x & bit1[j]) *code |= bit1[i];
else *code &= bit0[i];
if (i-- == 0) {
code++;
if (++len > clen) return -1L;
i = 7;
}
}
/* ½½¶óÀ̵åâÀ» µÚ·Î ºñÄÑ ³õ´Â´Ù */
texttop += ++l;
if (wintop + l >= winbrk) wintop = text + (l - (winbrk-wintop));
else wintop += l;
}
if (i < 7) len++;
return (len > clen) ? -1L : len;
}
long deLZ77(unsigned char *text, long tlen,
unsigned char *code, long clen)
{
int i, j;
int w, l, x;
unsigned char *wintop, *winbrk, *texttop;
unsigned char prewin[N0];
long c, len;
static int bit1[12] =
{ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
if (clen <= 0) return -1;
for (i = 0; i < N0; i++) prewin[i] = 0;
wintop = prewin; winbrk = wintop + N0;
texttop = text;
for (i = 7, len = 0, c = 1; ; ) {
unsigned char *wp;
w = l = x = 0;
/* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ °³½Ã À§Ä¡ */
for (j = LOG2N-1; j >= 0; j--) {
if (*code & bit1[i]) w |= bit1[j];
if (i-- == 0) {
code++;
if (++c > clen) return -1L;
i = 7;
}
}
/* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ ±æÀÌ */
for (j = LOG2F-1; j >= 0; j--) {
if (*code & bit1[i]) l |= bit1[j];
if (i-- == 0) {
code++;
if (++c > clen) return -1L;
i = 7;
}
}
/* ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ ´ÙÀ½ÀÇ ¹®ÀÚ */
for (j = 7; j >= 0; j--) {
if (*code & bit1[i]) x |= bit1[j];
if (i-- == 0) {
code++;
++c;
i = 7;
}
}
/* ij¸¯ÅÍ ¶óÀÎÀ» º¹È£ ÇÑ´Ù */
if ((wp = wintop + w) >= winbrk) wp = texttop + (w - (winbrk-wintop));
for (j = l; j > 0; j--) {
if (wp == winbrk) wp = texttop;
*text++ = *wp++;
}
len += l++;
if (c >= clen) break;
/* ½½¶óÀ̵åâÀ» µÚ·Î ºñÄÑ ³õ´Â´Ù */
*text++ = x;
if (wintop + l >= winbrk) wintop = texttop + (l - (winbrk-wintop));
else wintop += l;
len++;
}
return len;
}
LZ77 ºÎÈ£¿¡¼´Â, ÇöÀç ºÎÈ£¸¦ ½Ç½ÃÇϰí ÀÖ´Â ¹®ÀÚ¸¦ Æ÷ÇÔÇÑ Ä³¸¯ÅÍ ¶óÀÎÀ» ½½¶óÀ̵åâÀ̶ó°í ºÒ·¯, ±× Áß¿¡ Àִ ij¸¯ÅÍ ¶óÀÎÀÌ ÂüÁ¶ÀÇ ´ë»óÀÌ µÈ´Ù. ¶Ç, ºÎÈ£¾î´Â, m, l, x ·ÎºÎÅÍ µÈ´Ù 2 Áø¼ö·Î ³ªÅ¸³½´Ù.
m: ½½¶óÀ̵åâ¿¡ ÀÖ´Â ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ À§Ä¡
l: ½½¶óÀ̵åâ¿¡ ÀÖ´Â ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ ±æÀÌ
x: ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ ´ÙÀ½ÀÇ ¹®ÀÚ
ij¸¯ÅÍ ¶óÀÎÀÌ ½½¶óÀ̵åâ¿¡ Á¸ÀçÇÏÁö ¾Ê¾Ò´ø °æ¿ì´Â m = 0, l = 0 À¸·Î ÇÑ´Ù. ¶Ç, ½º ³îÀÌ ±â±¸Ã¢ÀÌ ºÎÈ£¾î¸¦ Ãâ·ÂÇÒ ¶§¸¶´Ù, l+1 ¹®ÀںР´ÙÀ½ÀÇ Ä³¸¯ÅÍ ¶óÀο¡ ºñÄÑ ³õ´Â´Ù.
ÀÌ¿Í °°ÀÌ, ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀ» °ú°ÅÀÇ ÅØ½ºÆ®·ÎºÎÅÍ Ã£¾Æ³»°í(»çÀüÀÇ ÂüÁ¶¶ó°íµµ ¸»ÇÑ´Ù), ±× °³½Ã À§Ä¡¿Í ±æÀ̸¦ ºÎÈ£¾î·Î¼ »ç¿ëÇÏ´Â °ÍÀÌ, LZ77 ºÎÈ£ÀÇ Æ¯Â¡ÀÌ´Ù. °³½Ã À§Ä¡¿Í ±æÀÌ¿¡ °üÇÑ Ç¥ÇöÀÇ ¹æ¹ýÀ̳ª ÃÖÀå ÀÏÄ¡ ij¸¯ÅÍ ¶óÀÎÀÇ Å½»öÀÇ ¹æ¹ý¿¡ µû¶ó, ¸î°³ÀÇ ¹Ù¸®¿¡À̼ÇÀÌ Á¸ÀçÇϰí ÀÖ´Ù.