LZW ºÎÈ£


ÇÔ¼ö¸í
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.
ÁÖÀÇ »çÇ×

¿ë·Ê(lzw-test.c )

ÇÁ·Î±×·¥(lzw.c )
#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;
}
¼³¸í
1984³â T. A. Welch °¡ °í¾È ÇÑ µ¥ÀÌÅÍ ¾ÐÃà ºÎÈ£·Î, J. Ziv ¿Í A. Lempel ÇÏÁö¸¸ 1978³â¿¡ ¹ßÇ¥ÇÑ LZ78 ºÎÈ£¸¦ °³·®ÇÑ °ÍÀÌ´Ù.

LZ78 ºÎÈ£´Â, »çÀüÀ¸·Î¼­ Áö±Ý±îÁö ¹ß°ßÇÑ ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀÇ À϶÷Ç¥¸¦ »ç¿ëÇÏ´Â ¿Í (À¸)·Î, Æ÷°ýÀûÀÎ »çÀüÀÇ ÀÛ¼ºÀÌ °¡´ÉÇØÁø´Ù. ½ÇÁ¦·Î´Â, ÀÔ·ÂµÈ Ä³¸¯ÅÍ ¶óÀÎÀ» Áõ ºÐ ºÐÇØ·Î ºÒ¸®´Â ¹æ¹ýÀ¸·Î ºÎºÐ ij¸¯ÅÍ ¶óÀÎ À¸·Î ºÐÇØÇØ, ¾òÀ» ¼ö ÀÖ´ø ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀ» »çÀü¿¡ µî·ÏÇØ, ÀÌ »çÀüÀ» ÀÌ¿ëÇØ encode¸¦ ½Ç½ÃÇÏ°í ÀÖ´Ù.

LZ78 ºÎÈ£¿¡¼­´Â, ºÎÈ£¾îÁß¿¡ ¹Ýµå½Ã ÀԷ ij¸¯ÅÍ ¶óÀÎÁßÀÇ ¹®ÀÚ ±× ÀÚü°¡ Æ÷ÇԵǾî ÀÖ´Ù ÇÏÁö¸¸, LZW ºÎÈ£¿¡´Â, 1 ¹®ÀڷκÎÅÍ µÇ´Â ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀ» ¸ðµÎ »çÀü¿¡ ¹Ì¸® µî·ÏÇØ (ÀÌ)¶ó°í µÎ´Â °ÍÀ¸·Î, ºÎÈ£¾îÁß¿¡ Æ÷ÇԵǴ ¹®ÀÚ¸¦ ¾ø¾Ö, Ç×»ó »çÀüÀÇ ÂüÁ¶ ¹øÈ£ ¸¸À¸·Î ³¡¸¶Ä£´Ù.

±¸Ã¼ÀûÀ¸·Î´Â, LZW ºÎÈ£´Â ÀÔ·Â ÅؽºÆ®¿¡ ÀÖ´Â ºÎºÐ ij¸¯ÅÍ ¶óÀο¡ ÂüÁ¶ ¹øÈ£¸¦ ³ª´©¾î Áø »çÀüÀ» ¸¸µé¾î, ´Ù½Ã ±× ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀÌ ³ªÅ¸³ª¸é(ÀÚ) ±× ÂüÁ¶ ¹øÈ£¸¦ ºÎÈ£¾î·Î ÇØ (ÀÌ)¶ó°í Ãâ·ÂÇÑ´Ù. ºÎºÐ ij¸¯ÅÍ ¶óÀÎÀÇ Á¶ÇÕÀº ÃÖÀå ÀÏÄ¡¹ýÀ¸·Î ½Ç½ÃÇØ, »õ·Ó°Ô µî·ÏÇÏ´Â ºÎºÐ¹® ÀÚ·ÄÀº ÀÌÀü¿¡ µî·ÏÇÑ °ÍÀ» 1 ¹®ÀÚ ¿¬ÀåÇÑ °ÍÀÌ´Ù. Ãʱ⠻çÀüÀº ÀԷ¿¡ ÀÖ´Â ¸ðµç ¹®ÀÚ¿¡ ÂüÁ¶ ¹øÈ£¸¦ ÇÒ´çÇÑ °ÍÀ¸·Î ÇÑ´Ù.

LZW ºÎÈ£¿¡¼­´Â, ºÎÈ£¾î¸¦ ÀÌÇÏ¿Í °°ÀÌ ÇØ ±¸¼ºÇÑ´Ù.

  1. ÃÖÃÊÀÇ ÀÔ·Â ¹®ÀÚ¸¦ w ·Î ÇÑ´Ù.
  2. ÀÔ·Â ÅؽºÆ®·ÎºÎÅÍ ´ÙÀ½ÀÇ ¹®ÀÚ K ¸¦ Àоîµé¿©,
    wK °¡ »çÀü¿¡ µî·ÏÁ¦À̸é, wK ¸¦ w ·Î ÇÑ´Ù.
    wK °¡ ¹Ìµî·ÏÀ̸é, w ¿¡ ´ëÀÀÇÏ´Â »çÀü ÂüÁ¶ ¹øÈ£¸¦ Ãâ·ÂÇØ, wK ¸¦ »çÀü µî·ÏÇÑ´Ù. ´ÙÀ½¿¡, K ¸¦ w ·Î ÇÑ´Ù.
  3. 2. ÀÇ Ã³¸®¸¦ ÀÔ·ÂÀÌ Á¾·áÇÒ ¶§±îÁö ¹Ýº¹ÇÑ´Ù.

LZW ºÎÈ£ÀÇ °¢Á¾ °³·®ÆÇÀ» ½ÇÁ¦·Î »ç¿ëÇÑ ¾ÐÃà ÇÁ·Î±×·¥À¸·Î¼­´Â, MS-DOS¿¡ ÀÖ¾î PKARC, UNIX ÀÇ compress Ä¿¸àµå, Macintosh ÀÇ StfuuIt µîÀÌ ÀÖ¾î, ÄÄÇ»Åͳª OSÀÇ Á¾·ù¸¦ ºÒ¹®ÇÏ°í, ³Ð°Ô ÀÌ¿ëµÇ°í ÀÖ´Ù. ¶Ç, È£- ¹«ÆäÀÌÁö¿¡ ³Ð°Ô ÀÌ¿ëµÇ°í ÀÖ´Â GIF À̹ÌÁö ÆÄÀÏ¿¡, ¾ÐÃà ¾Ë°í¸®Áò (À¸)·Î¼­ ä¿ëµÇ°í ÀÖ´Ù.

°ü·Ã ÇÔ¼ö
¼¨³Í¡¤ÆÄ³ë ºÎÈ£, ÇãÇÁ¸¸ ÄÚµù, »ê¼ú ºÎÈ£, FGK ºÎÈ£, LZ77 ºÎÈ£