본문 바로가기

UNIX_LINUX_C_C++

[펌] SLZ 압축 소스

Simple Compression using an LZ buffer

간단하게 사용할수 있는 압축 알고리즘이다.

압축할때 시간은 길지만, 압축 푸는 속도는 굉장히 빠르다.

따라서 boot 로더처럼 압축된 데이터를 rom으로 가지고 사용할 경우 굉장히 유용하다.

압축 푸는 코드는 경이로울 정도로 간단하다. 이해하기가 너무 힘들지만 ^^;;

아래 코드가 실제로 압축 푸는 부분이다.

void UnPackSLZ(unsigned char *inbuffer, register FILE *outfile)

{

short myTAG, mycount, myoffset;

long int loop1;

for(;;) // loop forever (until goto occurs to break out of loop)

{

myTAG=*inbuffer++;

for(loop1=0;(loop1!=8);loop1++)

{

if(myTAG&0x80)

{

if((mycount=*inbuffer++)==0) // Check EXIT

{ goto skip2; } // goto's are gross but it's efficient :(

else

{

myoffset=HISTORY_SIZE-(((MASK_upper&mycount)<<LSR_upper)+(*inbuffer++));

mycount&=MASK_lower;

mycount+=2;

while(mycount!=0)

{

writechar(LZ_history[(lzhist_offset+myoffset)&MASK_history],outfile);

mycount--;

}

}

}

else

{ writechar(*inbuffer++,outfile); }

myTAG+=myTAG;

}

}

skip2:

return;

}

소스 첨부했으니 참고 바랍니다.

http://thorkildsen.no/faqsys/docs/slz_art.txt

http://www.gamedev.net/reference/articles/article294.asp