64,653
社区成员
发帖
与我相关
我的任务
分享
void LZWCompress::Encode()
{
int i;
int prev; BYTE ch;
int chid = 1;
Entry list[MAX_VAL];
int indexlist[MAX_VAL][CHAR_COUNT];
int listid = TAG_BEGIN, codeid = 0;
memset(list, -1, sizeof(Entry) * MAX_VAL);
memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);
code = (int*)malloc(sizeof(int) * size);
DWORD t1 = GetTickCount();
int count = 0;
if (size < 3)
for (i = 0; i < size; i++)
code[codeid++] = (int)stream[i];
else
{
prev = (int)stream[0];
while (true)
{
count++;
if (chid >= size)
{
code[codeid++] = prev;
code[codeid++] = TAG_END;
break;
}
if (listid >= MAX_VAL)
{
code[codeid++] = TAG_NEW;
memset(list, -1, sizeof(Entry) * MAX_VAL);
memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);
listid = TAG_BEGIN;
}
ch = stream[chid];
if (indexlist[prev][ch] == -1)
{
list[listid].prev = prev; list[listid].ch = ch;
indexlist[prev][ch] = listid++; // This process must be advanced.
code[codeid++] = prev;
prev = (int)stream[chid];
}
else
prev = indexlist[prev][ch];
chid++;
}
}
printf("%d\n", codeid);
DWORD t2 = GetTickCount();
printf("%d times.\n", count);
printf("Encoding time: %d.\n", t2 - t1);
}
if (listid >= MAX_VAL)
{
code[codeid++] = TAG_NEW;
memset(list, -1, sizeof(Entry) * MAX_VAL);
memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);
listid = TAG_BEGIN;
}