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;
}
소스 첨부했으니 참고 바랍니다.
'UNIX_LINUX_C_C++' 카테고리의 다른 글
[펌] 허프만 코드를 이용한 압축 (0) | 2011.10.16 |
---|---|
[펌] 압축 알고리즘 소스 및 정리 (0) | 2011.10.16 |
[펌] 공유 메모리(shared memory) 의 사용 (0) | 2011.10.14 |
[펌] 아파치 http 서버의 확장모듈을 컴파일하고 설치하는 도구 (0) | 2011.10.14 |
[펌] 제3장 클라이언트-서버 토크 프로그램 (0) | 2011.10.14 |