Posted by: login November 18, 2004
LZ77 Help!
Login in to Rate this Post:     0       ?        
Hey Ya'll who were interested in the lz77 program. I finally finished it. Took a different approach and yes, I am done!!! What a relief.... This program will compress and decompress the file. Peace! LoGiN :) #include #include #include #include #define SW_SIZE 4096 /* sliding window will be 4k bytes */ #define LA_SIZE 32 /* Look Ahead Buffer will be 32 bytes */ #define PASS 1 #define FAIL 0 /* function declarations */ void BytesToBits(unsigned char, int) ; int BitsToBytes(unsigned char *, int) ; int FindMatch(unsigned char *, unsigned char *, int) ; int BiggestMatch(unsigned char *, unsigned char *, int) ; void BuildZeroCode(unsigned char) ; int BuildOneCode(int, unsigned char) ; int ZeroCodeWrite(void) ; int OneCodeWrite(void) ; /* global variables */ int curr_len = 0 ; unsigned char curr_byte = 0 ; FILE *f_input, *f_output ; unsigned char *p_start ; unsigned char *p_sw ; unsigned char *p_la ; unsigned char *p_la_start ; unsigned char *p_flag ; unsigned char *p_end ; int offset = 0 ; int len ; unsigned char temp[31] ; void BytesToBits(unsigned char in_char, int in_len) { unsigned char temp_char, mask ; if(in_len + curr_len > 7) /* the number bits to be added to curr_byte will at least fill curr_byte to capacity */ { temp_char = in_char ; /* stores in_char in temp variable for manipulation */ temp_char >>= (in_len + curr_len - 8) ; /* shifts temp variable over to the right so the bits that we want to deal with are in the appropriate psoition */ mask = (unsigned char)(pow(2, 8 - curr_len) - 1) ; /* creates a mask that will affect the number of bits needed to fill curr_byte */ temp_char &= mask ; /* sets all other bytes besides the ones that will fill curr_byte to zero */ curr_byte |= temp_char ; /* puts the bit(s) needed to fill curr_byte in the appropriate position(s) */ putc(curr_byte, f_output) ; /* writes curr_byte to a file */ curr_byte = 0 ; /* flushes curr_byte */ curr_len = in_len = in_len + curr_len - 8 ; /* changes curr_len and in len to reflect how many bytes are needed to fill curr_byte */ curr_byte = (in_char <<= 8 - in_len) ; /* shifts any left over bits from in_char to the appropriate position and puts them into curr_byte */ } else /* the number of bits to be added to curr_byte does not fill curr_byte */ { mask =(unsigned char)(pow(2, in_len) - 1) ; /* creates a mask that will affect the number of bits to be added to curr_byte */ in_char &= mask ; /* sets all other bytes other bytes besides the ones to be added to curr_byte to zero */ in_char <<= (8 - curr_len - in_len) ; /* shifts bits that are to be added to curr_byte to the appropriate position */ curr_byte |= in_char ; /* adds bits to be added to curr_byte to curr_byte */ curr_len += in_len ; /* curr_len chnages to reflect nu,ber of free bits remaining in curr_byte */ } }
Read Full Discussion Thread for this article