serg128 |
Отправлено: 28.05.2006, 09:50 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 46
|
Как сконвертить строку в base64, но желательно без использования заумных бибилиотек? Приведите код, плиз!
Заранее спасибо! |
|
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;
}
//---------------------------------------------------------------------------
| |
|
|