//---------------------------------------------------------------------------
// Проект 28. Кодирование Base64
// Текст ↔ Base64, ядро проверено на эталонах.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Классический Base64. Ядро кодирования проверяется тестом на известных
// строках ("Man" → "TWФu" и т.п.).
static const char B64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
AnsiString b64encode(const unsigned char *data, int len)
{
    AnsiString out;
    int i=0;
    while (i<len){
        int b0=data[i++], b1=(i<len)?data[i++]:-1, b2=(i<len)?data[i++]:-1;
        out += B64[b0>>2];
        out += B64[((b0&3)<<4) | (b1>=0?(b1>>4):0)];
        out += (b1>=0)? AnsiString(B64[((b1&15)<<2)|(b2>=0?(b2>>6):0)]) : AnsiString("=");
        out += (b2>=0)? AnsiString(B64[b2&63]) : AnsiString("=");
    }
    return out;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonEncClick(TObject *Sender)
{
    AnsiString s = EditIn->Text;
    EditOut->Text = b64encode((const unsigned char*)s.c_str(), s.Length());
}
//---------------------------------------------------------------------------
