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 À̹ÌÁö ÆÄÀÏ¿¡, ¾ÐÃà ¾Ë°í¸®Áò (À¸)·Î¼ ä¿ëµÇ°í ÀÖ´Ù.