#include #include #include using namespace std; int main() { char * buffin = (char*)malloc(1024*4+4);//+4 prevents need for index out of range checks char * buffout = (char*)malloc(1024*4); char * bufftmp = (char*)malloc(1024*4); std::fstream file; file.open ("/uploads/tt.bin", std::fstream::in | std::fstream::binary); file.read(buffin,1024*4); file.close(); buffin[1024*4+0]=buffin[1024*4-2]+1;buffin[1024*4+1]=buffin[1024*4-1]+1; //ensure last four bytes don't match buffin[1024*4+2]=buffin[1024*4-2]-1;buffin[1024*4+3]=buffin[1024*4-1]-1; //ensure last four bytes don't match file.open ("/myfiles/tt.rle", std::fstream::out | std::fstream::binary); char cur; int i=0;int o=0; buffout[o++]=0x01;//size 4kb buffout[o++]=0x01;//size of count values? int t; while (i<1024*4){ //low bytes if (buffin[i]!=buffin[i+2]){ //start of nonrepeating t=0; while ((i<1024*4) && (buffin[i+2]!=buffin[i+4]) && (t<127-1)) {bufftmp[t++]=buffin[i];i+=2;} //while not start of repeating bufftmp[t++]=buffin[i];i+=2; buffout[o++]=t;memcpy(buffout+o,bufftmp,t);o+=t;continue; } else { //start of repeating t=1;i+=2; while ((i<1024*4) && (buffin[i-2]==buffin[i]) && (t<127)) {t++;i+=2;} //while not start of repeating buffout[o++]=0x80|t;buffout[o++]=buffin[i-2];continue; } } buffout[o++]=0x00; //terminator buffout[o++]=0x02; //size of count values? i=1; while (i<1024*4){ //high bytes if (buffin[i]!=buffin[i+2]){ //start of nonrepeating t=0; while ((i<1024*4) && (buffin[i+2]!=buffin[i+4]) && (t<32767-1)) {bufftmp[t++]=buffin[i];i+=2;} //while not start of repeating bufftmp[t++]=buffin[i];i+=2; buffout[o++]=t>>8;buffout[o++]=0xff&t;memcpy(buffout+o,bufftmp,t);o+=t;continue; } else { //start of repeating t=1;i+=2; while ((i<1024*4) && (buffin[i-2]==buffin[i]) && (t<32767)) {t++;i+=2;} //while not start of repeating buffout[o++]=(t>>8)|0x80;buffout[o++]=0xff&t;buffout[o++]=buffin[i-2];continue; } } buffout[o++]=0x00; //terminator buffout[o++]=0x00; //terminator file.write(buffout,o); file.close(); free(buffin);free(buffout);free(bufftmp); return 0; }