//CODER
#include <stdio.h>
#include <math.h>
int coder()
{
char inputTextName[255];
printf("Enter text file name:\n");
scanf("%s",inputTextName);
FILE* inputText=fopen(inputTextName,"rb");
fseek(inputText,0,SEEK_END);
int fileSize=ftell(inputText);
fseek(inputText,0,SEEK_SET);
char* textData=new char[fileSize];
for(int i=0; !feof(inputText); i++)
textData[i]=getc(inputText);
char inputBmpName[255];
printf("Enter bmp file name:\n");
scanf("%s", inputBmpName);
int numBits;
printf("Enter number of bits in one byte:\n");
scanf("%d",&numBits);
if ((numBits < 1) || (numBits > 8)) return -1;
numBits--;
FILE* inputBmp=fopen(inputBmpName,"rb");
FILE* outputBmp=fopen("out.bmp","wb");
for(int i=0;i<54;i++)
{
int buffer=getc(inputBmp);
putc(buffer, outputBmp);
}
int mask=pow(2.0,31);
for(int i=0; i<32; i++, mask>>=1)
{
int buffer=getc(inputBmp);
if(fileSize & mask)
buffer|=1;
else
buffer&=~1;
putc(buffer, outputBmp);
}
mask=pow(2.0,2);
for(int i=0;i<3;i++, mask>>=1) //Compression putting cycle
{
int buffer=getc(inputBmp);
if(numBits & mask)
buffer|=1;
else
buffer&=~1;
putc(buffer, outputBmp);
}
for(int i=0; i<fileSize; i++)
{
char buffer_char=textData[i];
mask=pow(2.0,7);
int compr_mask=0;
for(int j=0; j<8; j++, mask>>=1, compr_mask>>=1)
{
int buffer=getc(inputBmp);
if(!compr_mask)
compr_mask=pow(2.0,numBits);
if(buffer_char & mask)
buffer |= compr_mask;
else
buffer &=~ compr_mask;
putc(buffer,outputBmp);
}
}
while(!feof(inputBmp))
{
int buffer=getc(inputBmp); //other file copying cycle
putc(buffer, outputBmp);
}
fclose(inputBmp);
fclose(outputBmp);
return 1;
}
int decoder(const char* path)
{
FILE* opened_read, * opened_write;
unsigned char buffer, temp_mask_char, compr_mask, mask_1=1;
unsigned int buffer_text, temp_mask_int;
int compr=0, size_text=0;
if(!((opened_read=fopen(path,"rb")) && (opened_write=fopen("uncoded.txt", "wb"))))
return -1;//throw (Exception(Exception::Unopened));
int c=fseek(opened_read,54,SEEK_SET);
temp_mask_int=pow(2.0,31);
for(int i=0;i<32;i++, temp_mask_int>>=1) //Size getting cycle
{
buffer=getc(opened_read);
if(buffer&mask_1)
size_text|=temp_mask_int;
}
temp_mask_int=pow(2.0,2);
for(int i=0;i<3;i++, temp_mask_int>>=1) //Compression getting cycle
{
buffer=getc(opened_read);
if(buffer&mask_1)
compr|=temp_mask_int;
}
compr_mask=(char)pow(2.0,compr);
for(int i=0;i<size_text;i++)
{
if(feof(opened_read))
return -1;//throw (Exception(Exception::End_reach));
temp_mask_char=128;
buffer_text=0;
for(int j=0;j<8;j++,temp_mask_char>>=1,compr_mask>>=1)
{
if(!compr_mask)
compr_mask=pow(2.0,compr);
buffer=getc(opened_read);
if(buffer&compr_mask)
buffer_text|=temp_mask_char;
}
putc(buffer_text,opened_write);
}
fclose(opened_read);
fclose(opened_write);
return 1;
}
int main() {
//coder();
decoder("out.bmp");
return 1;
}