Пере Кодировка base64

Данная кодировка используется многими майл клиентами (например outlook express) для отправки аттачей(вложений) в письмах знать ее алгоритм достаточно полезно...


HANDLE FileData;
DWORD nReadBytes;

const char base64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
long base64encode(const char* FileName, char* buffer,unsigned int length)
{

unsigned char ReadData[57];
unsigned char ResData[76];
unsigned long p=0;
unsigned long len=0;
unsigned long SourceLen=0;
unsigned long CurResBufferPos=0;
unsigned int j;
unsigned char tmpchar;
FileData=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
if(FileData==INVALID_HANDLE_VALUE) return 0; //открываем фаил

do
{
memset(ReadData,0,57);//выделяем память
ReadFile(FileData,ReadData,57,&nReadBytes,NULL);//считываем фаил в память
if (nReadBytes==0)
{
CloseHandle(FileData);
return len;
}
j=0;
SourceLen+=nReadBytes;
for(unsigned int i=0;i<nReadBytes;i+=3) //поехали
{

p=ReadData[i+2]+ReadData[i+1]*256+ReadData[i]*65536;
for(unsigned char i1=0;i1<3;i1++)
{
tmpchar=p;
tmpchar<<=2;
tmpchar>>=2;//
ResData[j+3-i1]=tmpchar;
p>>=6;
}
ResData[j]=p;
j+=4;
}

len+=j+1;

if(len<=length)//если есть место в буффере
{
for(unsigned char i1=0;i1<j;i1++)
{
buffer[CurResBufferPos+i1]=base64[ResData[i1]];
}

buffer[CurResBufferPos+j]='\n';
CurResBufferPos+=j+1;
}
else return 0;

}
while(nReadBytes==57);


char pad=(3-SourceLen%3)%3;
while(pad>0)
{
buffer[CurResBufferPos-1-pad]='=';
pad--;
}
CloseHandle(FileData);
return len;
}

Пример вызова функции:

base64encode("file.exe",CodedData,sizeof(CodedData));

CodedData - char массив для перекодированного фаила

char CodedData[150000];

 

 
Хостинг от uCoz