enLZW LZW ºÎÈ£ deLZW LZW ºÎÈ£·ÎºÎÅÍÀÇ º¹È£
LZW ºÎÈ£ long enLZW(unsigned char *code, long clen, unsigned char *text, long tlen); LZW ºÎÈ£·ÎºÎÅÍÀÇ º¹È£ long deLZW(unsigned char *text, long tlen, unsigned char *code, long clen);
LZW ºÎÈ£ ÇÔ¼ö¿¡ ´ëÇØ code (ÀÔÃâ·Â) LZW ºÎÈ£¸¦ °Ý³³ÇÏ´Â ¹è¿ clen (ÀÔ·Â) ¹è¿ codeÀÇ ±æÀÌ text (ÀÔ·Â) ÅؽºÆ®¸¦ °Ý³³ÇÏ´Â ¹è¿ tlen (ÀÔ·Â) ¹è¿ textÀÇ ±æÀÌ LZW ºÎÈ£·ÎºÎÅÍÀÇ º¹È£ ÇÔ¼ö¿¡ ´ëÇØ text (ÀÔÃâ·Â) ÅؽºÆ®¸¦ °Ý³³ÇÏ´Â ¹è¿ tlen (ÀÔ·Â) ¹è¿ textÀÇ ±æÀÌ code (ÀÔ·Â) LZW ºÎÈ£¸¦ °Ý³³ÇÏ´Â ¹è¿ clen (ÀÔ·Â) ¹è¿ codeÀÇ ±æÀÌ
LZW ºÎÈ£ ÇÔ¼ö¿¡ ´ëÇØ LZW ºÎÈ£ÀÇ ±æÀÌ. encode¿¡ ½ÇÆÐÇßÀ» ¶§´Â -1L. LZW ºÎÈ£·ÎºÎÅÍÀÇ º¹È£ ÇÔ¼ö¿¡ ´ëÇØ ÅؽºÆ®ÀÇ ±æÀÌ. º¹È£¿¡ ½ÇÆÐÇßÀ» ¶§´Â -1L.
#define CHAR_SIZE 256 #define NODE_SIZE 4096 #define BITS_LEN 12 /* 2^^12 = 4096 */ typedef struct { unsigned char chr; /* ¹®ÀÚ */ int parent; /* Ä£³ëµå¿¡ */ int brother; /* ÇüÁ¦ ³ëµå¿¡ */ int child; /* ÀÚ ³ëµå¿¡ */ } NODE; long enLZW(unsigned char *code, long clen, unsigned char *text, long tlen) { int i, j; int w, k, rv; long c, len; int freeNode; NODE node[NODE_SIZE]; static int wMask[BITS_LEN] = { 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1}; static unsigned char bit0[8] = {~128,~64,~32,~16,~8,~4,~2,~1}; static unsigned char bit1[8] = { 128, 64, 32, 16, 8, 4, 2, 1}; if (tlen <= 0) return -1; for (i = 0; i <= CHAR_SIZE; i++) { node[i]. chr = (unsigned char) i; node[i]. brother = i+1; node[i]. parent = node[i]. child = 0; } node[CHAR_SIZE]. brother = 0; freeNode = CHAR_SIZE + 1; /* encode¿Í ³ª¹«ÀÇ °»½Å */ w = text[0]; for (c = 1, i = 0, len = 0; ; c++) { k = (c >= tlen) ? CHAR_SIZE : text[c]; /* wk °¡ µî·ÏÁ¦ ? */ for (rv = node[w]. child; rv > 0; rv = node[rv]. brother) if (node[rv]. chr == k) break; if (rv > 0) w = rv; else { /* ÂüÁ¶ ¹øÈ£¸¦ Ãâ·Â */ for (j = 0; j < BITS_LEN; j++) { if (w & wMask[j]) *code |= bit1[i]; else *code &= bit0[i]; if (++i == 8) { code++; if (++len > clen) return -1L; i = 0; } } /* wk ¸¦ µî·Ï */ if (freeNode < NODE_SIZE) { node[freeNode]. parent = w; node[freeNode]. chr = k; node[freeNode]. brother = node[w]. child; node[freeNode]. child = 0; node[w]. child = freeNode++; } w = k; } if (c == tlen+1) break; /* EOF */ } if (i > 0) len++; return (len > clen) ? -1L : len; } long deLZW(unsigned char *text, long tlen, unsigned char *code, long clen) { int i, j; int w, k, rv; long c, len; int freeNode; NODE node[NODE_SIZE]; int stack[NODE_SIZE]; int sp; static int wMask[BITS_LEN] = { 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1}; static unsigned char bit1[8] = { 128, 64, 32, 16, 8, 4, 2, 1}; if (clen <= 0) return -1; for (i = 0; i <= CHAR_SIZE; i++) { node[i]. chr = (unsigned char) i; node[i]. brother = i+1; node[i]. parent = node[i]. child = 0; } node[CHAR_SIZE]. brother = 0; freeNode = CHAR_SIZE + 1; /* º¹È£È¿Í ³ª¹«ÀÇ °»½Å */ for (i = 0, len = 0, c = 0, sp = 0; ; ) { for (j = 0, rv = 0; j < BITS_LEN; j++) { if (*code & bit1[i]) rv |= wMask[j]; if (++i == 8) { code++; if (++c > clen) return -1L; i = 0; } } if (rv == CHAR_SIZE) break; /* EOF */ /* ÂüÁ¶ ¹øÈ£¿¡ ´ëÀÀÇÏ´Â ³ëµå·ÎºÎÅÍ ·çÆ®±îÁö ¿À¸£¸é¼ ¹®ÀÚ¸¦ Ãâ·Â */ if (rv >= freeNode) { stack[sp++] = k; /* ¿¹¿Ü ó¸® */ k = w; } else k = rv; while (k > CHAR_SIZE) { stack[sp++] = node[k]. chr; k = node[k]. parent; } stack[sp++] = k; while (sp) { if (++len > tlen) return -1L; *text++ = stack[--sp]; } /* wk ¸¦ µî·Ï */ if (len > 1 && freeNode < NODE_SIZE) { node[freeNode]. parent = w; node[freeNode]. chr = k; node[freeNode]. brother = node[w]. child; node[freeNode]. child = 0; node[w]. child = freeNode++; } w = rv; } return len; }
LZ78 ºÎÈ£´Â, »çÀüÀ¸·Î¼ Áö±Ý±îÁö ¹ß°ßÇÑ ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀÇ À϶÷Ç¥¸¦ »ç¿ëÇÏ´Â ¿Í (À¸)·Î, Æ÷°ýÀûÀÎ »çÀüÀÇ ÀÛ¼ºÀÌ °¡´ÉÇØÁø´Ù. ½ÇÁ¦·Î´Â, ÀÔ·ÂµÈ Ä³¸¯ÅÍ ¶óÀÎÀ» Áõ ºÐ ºÐÇØ·Î ºÒ¸®´Â ¹æ¹ýÀ¸·Î ºÎºÐ ij¸¯ÅÍ ¶óÀÎ À¸·Î ºÐÇØÇØ, ¾òÀ» ¼ö ÀÖ´ø ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀ» »çÀü¿¡ µî·ÏÇØ, ÀÌ »çÀüÀ» ÀÌ¿ëÇØ encode¸¦ ½Ç½ÃÇÏ°í ÀÖ´Ù.
LZ78 ºÎÈ£¿¡¼´Â, ºÎÈ£¾îÁß¿¡ ¹Ýµå½Ã ÀԷ ij¸¯ÅÍ ¶óÀÎÁßÀÇ ¹®ÀÚ ±× ÀÚü°¡ Æ÷ÇԵǾî ÀÖ´Ù ÇÏÁö¸¸, LZW ºÎÈ£¿¡´Â, 1 ¹®ÀڷκÎÅÍ µÇ´Â ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀ» ¸ðµÎ »çÀü¿¡ ¹Ì¸® µî·ÏÇØ (ÀÌ)¶ó°í µÎ´Â °ÍÀ¸·Î, ºÎÈ£¾îÁß¿¡ Æ÷ÇԵǴ ¹®ÀÚ¸¦ ¾ø¾Ö, Ç×»ó »çÀüÀÇ ÂüÁ¶ ¹øÈ£ ¸¸À¸·Î ³¡¸¶Ä£´Ù.
±¸Ã¼ÀûÀ¸·Î´Â, LZW ºÎÈ£´Â ÀÔ·Â ÅؽºÆ®¿¡ ÀÖ´Â ºÎºÐ ij¸¯ÅÍ ¶óÀο¡ ÂüÁ¶ ¹øÈ£¸¦ ³ª´©¾î Áø »çÀüÀ» ¸¸µé¾î, ´Ù½Ã ±× ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀÌ ³ªÅ¸³ª¸é(ÀÚ) ±× ÂüÁ¶ ¹øÈ£¸¦ ºÎÈ£¾î·Î ÇØ (ÀÌ)¶ó°í Ãâ·ÂÇÑ´Ù. ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀÇ Á¶ÇÕÀº ÃÖÀå ÀÏÄ¡¹ýÀ¸·Î ½Ç½ÃÇØ, »õ·Ó°Ô µî·ÏÇÏ´Â ºÎºÐ¹® ÀÚ·ÄÀº ÀÌÀü¿¡ µî·ÏÇÑ °ÍÀ» 1 ¹®ÀÚ ¿¬ÀåÇÑ °ÍÀÌ´Ù. Ãʱ⠻çÀüÀº ÀԷ¿¡ ÀÖ´Â ¸ðµç ¹®ÀÚ¿¡ ÂüÁ¶ ¹øÈ£¸¦ ÇÒ´çÇÑ °ÍÀ¸·Î ÇÑ´Ù.
LZW ºÎÈ£¿¡¼´Â, ºÎÈ£¾î¸¦ ÀÌÇÏ¿Í °°ÀÌ ÇØ ±¸¼ºÇÑ´Ù.
LZW ºÎÈ£ÀÇ °¢Á¾ °³·®ÆÇÀ» ½ÇÁ¦·Î »ç¿ëÇÑ ¾ÐÃà ÇÁ·Î±×·¥À¸·Î¼´Â, MS-DOS¿¡ ÀÖ¾î PKARC, UNIX ÀÇ compress Ä¿¸àµå, Macintosh ÀÇ StfuuIt µîÀÌ ÀÖ¾î, ÄÄÇ»Åͳª OSÀÇ Á¾·ù¸¦ ºÒ¹®ÇÏ°í, ³Ð°Ô ÀÌ¿ëµÇ°í ÀÖ´Ù. ¶Ç, È£- ¹«ÆäÀÌÁö¿¡ ³Ð°Ô ÀÌ¿ëµÇ°í ÀÖ´Â GIF À̹ÌÁö ÆÄÀÏ¿¡, ¾ÐÃà ¾Ë°í¸®Áò (À¸)·Î¼ ä¿ëµÇ°í ÀÖ´Ù.