C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как сконвертить строку в base64?, Как сконвертить строку в base64?
serg128
Отправлено: 28.05.2006, 09:50


Дежурный стрелочник

Группа: Участник
Сообщений: 46



Как сконвертить строку в base64, но желательно без использования заумных бибилиотек? Приведите код, плиз! smile.gif

Заранее спасибо!
Guest
Отправлено: 06.06.2006, 01:35


Не зарегистрирован







static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";

void encodeblock( unsigned char in[3], unsigned char out[4], int len )
{
out[0] = cb64[ in[0]>> 2 ];
out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0)>> 4) ];
out[2] = (unsigned char) (len> 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0)>> 6) ] : '=');
out[3] = (unsigned char) (len> 2 ? cb64[ in[2] & 0x3f ] : '=');
}
//---------------------------------------------------------------------------

void encode( FILE *infile, FILE *outfile, int linesize )
{
unsigned char in[3], out[4];
int i, len, blocksout = 0;

while( !feof( infile ) ) {
len = 0;
for( i = 0; i < 3; i++ ) {
in[i] = (unsigned char) getc( infile );
if( !feof( infile ) ) {
len++;
}
else {
in[i] = 0;
}
}
if( len ) {
encodeblock( in, out, len );
for( i = 0; i < 4; i++ ) {
putc( out[i], outfile );
}
blocksout++;
}
if( blocksout>= (linesize/4) || feof( infile ) ) {
if( blocksout ) {
fprintf( outfile, "\r\n" );
}
blocksout = 0;
}
}
}

//---------------------------------------------------------------------------
AVC
Отправлено: 06.06.2006, 08:12


Ветеран

Группа: Модератор
Сообщений: 1583



Вариант для Builder на базе AnsiString
QUOTE

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
//      Base64
//
//                           Алфавит Base64
//    Значение Код    Значение Код    Значение Код    Значение Код
//           0 A            17 R            34 i            51 z
//           1 B            18 S            35 j            52 0
//           2 C            19 T            36 k            53 1
//           3 D            20 U            37 l            54 2
//           4 E            21 V            38 m            55 3
//           5 F            22 W            39 n            56 4
//           6 G            23 X            40 o            57 5
//           7 H            24 Y            41 p            58 6
//           8 I            25 Z            42 q            59 7
//           9 J            26 a            43 r            60 8
//          10 K            27 b            44 s            61 9
//          11 L            28 c            45 t            62 +
//          12 M            29 d            46 u            63 /
//          13 N            30 e            47 v
//          14 O            31 f            48 w            = (заполнитель)
//          15 P            32 g            49 x
//          16 Q            33 h            50 y
//
//---------------------------------------------------------------------------

char    alfBase64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

//---------------------------------------------------------------------------
//                                                 Строку AnsiString в Base64
//---------------------------------------------------------------------------

PACKAGE AnsiString __fastcall ToBase64 (const AnsiString& text)
{
return ToBase64(text.c_str(), text.Length());
}

//---------------------------------------------------------------------------
//                                            Из строки в Base64 в AnsiString
//---------------------------------------------------------------------------

PACKAGE AnsiString __fastcall FromBase64 (const AnsiString& text)
{
int      len = ((text.Length() + 3) / 4) * 3;
char    *buf = new char[len+1];

len = FromBase64(text, buf, len);

buf[len] = 0x00;
AnsiString rettext = AnsiString(buf);
delete [] buf;
return rettext;
}

//---------------------------------------------------------------------------
//                                   Блок данных в строку, в кодировке Base64
//---------------------------------------------------------------------------

PACKAGE AnsiString __fastcall ToBase64 (const void* databuf
                                      ,unsigned int bufsize
                                      )
{
if (databuf == NULL)    return "";
if (bufsize == 0x00)    return "";

AnsiString rettext = "";

int     ibuf;
char    b64[5];
char    *cp=(char*)(databuf);

for (unsigned int ui=0; ui < bufsize; )
{      memset(b64, 0x00, sizeof(b64));
                           ibuf  = (*cp & 0xFF) << 16;     ui++;   cp++;
       if (ui < bufsize) { ibuf |= (*cp & 0xFF) <<  8;     ui++;   cp++; }  else b64[2] = b64[3] = '=';
       if (ui < bufsize) { ibuf |= (*cp & 0xFF) <<  0;     ui++;   cp++; }  else b64[3] = '=';

                           b64[0] = alfBase64[(ibuf>> 18) & 0x3F];
                           b64[1] = alfBase64[(ibuf>> 12) & 0x3F];
       if (b64[2] == 0)    b64[2] = alfBase64[(ibuf>>  6) & 0x3F];
       if (b64[3] == 0)    b64[3] = alfBase64[(ibuf>>  0) & 0x3F];
       rettext += AnsiString(b64);
}

return rettext;
}

//---------------------------------------------------------------------------
//                                           Из строки в Base64 в блок данных
//                                           Возврат — реально прочитано байт
//---------------------------------------------------------------------------

PACKAGE unsigned long __fastcall FromBase64 (const AnsiString&  text
                                           ,const void*        databuf
                                           ,unsigned int       bufsize
                                           )
{
if (databuf == NULL)    return 0l;
if (bufsize == 0x00)    return 0l;

char           *cpoi = (char*)databuf;
unsigned long   ret  = 0l;
#define add_char(chr)   { *cpoi++ = chr; ret++; if (ret>= bufsize) return ret; }

char    strn[4];
int     shift = 18;
int     ibuf  = 0;
for (char *cp=text.c_str(); *cp; cp++)
{      if (*cp == '=') break;

       char *bp = (char*)(memchr(alfBase64, *cp, sizeof(alfBase64)));
       if (!bp)        continue;
       ibuf |= ((bp — alfBase64) & 0x3F) << shift;
       shift -= 6;
       if (shift < 0)
        {      add_char((ibuf>> 16) & 0xFF);
               add_char((ibuf>>  8) & 0xFF);
               add_char((ibuf>>  0) & 0xFF);
               shift = 18;
               ibuf  = 0;
        }
}

if (shift < 12) add_char((ibuf>> 16) & 0xFF);
if (shift <  6) add_char((ibuf>>  8) & 0xFF);
if (shift <  0) add_char((ibuf>>  0) & 0xFF);

#undef add_chr;
return ret;
}

//---------------------------------------------------------------------------


Вернуться в Вопросы программирования в C++Builder