LINUX.ORG.RU

base64 C


0

0

Как реализовать base64 кодирование/декодирование ? Какие есть стандартные либы для этого?

anonymous

Ответ на: комментарий от anonymous

А никто не поделится готовым алгоритмом, только чтобы он мог бинарные данные кодировать. Или ссылку, что то гугл не особо помог, одни только цифры, другие тока текст..

anonymous
()
Ответ на: комментарий от anonymous

>бинарные данные кодировать

а какая разница между тестом и цифрами, по-моему тебе надо язык C выучить.

anonymous
()
Ответ на: комментарий от anonymous

ну между текстом и цифрами разницы мож и нету, но если алгоритм явно рассчитан на преобразование ascii кодов, то я не думаю что он то же самое сделает с двоичным кодом

anonymous
()
Ответ на: комментарий от anonymous

до чего-же люди обленились...
www.google.ru<enter>
base64<enter>
итого 21 раз щелкнуть по клавиатуре..
на первой странице видим :
(первая строка) http://www.fourmilab.ch/webtools/base64/
(берем оттуда исходник),
далее упоминается RFC3548, 
просто щелкая по ссылкам получаем http://www.faqs.org/rfcs/rfc3548.html
(берет оттуда описание кодера)

блин, да я печатал дольше..

p.s. исходничек правда так себе ;-)

anonymous
()

например в dictd в файле libmaa/base64:


static unsigned char b64_list[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

#define XX 100

static int b64_index[256] = {
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, XX,XX,XX,63,
52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,XX,XX,XX,
XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX,
XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
};

/* |b64_encode| encodes |val| in a printable base 64 format. A MSB-first
encoding is generated. */

const char *b64_encode( unsigned long val )
{
static char result[7];
int i;

result[0] = b64_list[ (val & 0xc0000000) >> 30 ];
result[1] = b64_list[ (val & 0x3f000000) >> 24 ];
result[2] = b64_list[ (val & 0x00fc0000) >> 18 ];
result[3] = b64_list[ (val & 0x0003f000) >> 12 ];
result[4] = b64_list[ (val & 0x00000fc0) >> 6 ];
result[5] = b64_list[ (val & 0x0000003f) ];
result[6] = 0;

for (i = 0; i < 5; i++) if (result[i] != b64_list[0]) return result + i;
return result + 5;
}

unsigned long b64_decode( const char *val )
{
unsigned long v = 0;
int i;
int offset = 0;
int len = strlen( val );

for (i = len - 1; i >= 0; i--) {
int tmp = b64_index[ (unsigned char)val[i] ];

if (tmp == XX)
err_internal( __FUNCTION__,
"Illegal character in base64 value: `%c'\n", val[i] );

v |= tmp << offset;
offset += 6;
}

return v;
}

fghj ★★★★★
()
Ответ на: комментарий от anonymous

Я видел функции для работы с base64 в исходниках libc. Не знаю можно ли их просто вызывать из библиотеки(скорее всего да), я просто взял оттуда исходник.

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.