#include #include #include #include #include "compressor.h" #define BUFSIZE 1024 int ByteRLEEncode(char* bufferIn, int size, char* bufferOut) { int posIn = 0, count = 1, posOut = 0; char byteCurrent, byteRLE = bufferIn[posIn++]; while (posIn != size) { byteCurrent = bufferIn[posIn++]; if (byteCurrent == byteRLE) { count++; if (count == 256) { bufferOut[posOut++] = byteRLE; bufferOut[posOut++] = 255; count = 1; } } else { bufferOut[posOut++] = byteRLE; bufferOut[posOut++] = count; byteRLE = byteCurrent; count = 1; } } bufferOut[posOut++] = byteRLE; bufferOut[posOut++] = count; return posOut; } int mycompress(char* bufferIn, int size, char* bufferOut){ return ByteRLEEncode(bufferIn, size, bufferOut);; } void compress(FILE *infile, FILE *outfile){ char buffer[BUFSIZE]; memset(buffer,0,BUFSIZE); while(1){ int insize = fread(buffer,sizeof(char),BUFSIZE,infile); if (insize == 0){ if (feof(infile)){ // end of file break; } assert(!ferror(infile)); } char outbuf[BUFSIZE*2]; // Doplnte implementaciu kompresie. int outsize = mycompress(buffer,insize,outbuf); if (outsize > 0){ fwrite(outbuf,sizeof(char),outsize,outfile); } } } void decompress(FILE *infile, FILE *outfile){ unsigned char RLEMetadata[2]; char RLEData[255]; while (fread(RLEMetadata, 2, 1, infile)) { printf("%c %d\n", RLEMetadata[0], RLEMetadata[1]); for (int i = 0; i < RLEMetadata[1]; i++) { RLEData[i] = RLEMetadata[0]; } fwrite(RLEData, RLEMetadata[1], 1, outfile); } }