[devel] base2 <-> base62

Alexey Tourbin at на altlinux.ru
Ср Авг 4 21:18:18 UTC 2010


Ломал голову несколько часов.  Кто знает тому пряник.

Есть слово в алфавите {0,1} - т.е. последовательность нулей и единиц.
Хочется представить это слово в алфавите {0..9,a..z,A..Z} (base62)
для экономии битов.  То есть получить более короткое представление
этой последовательности в виде букв и цифр.  И нужно уметь
конвертировать назад.

Понятно, что если из последовательности сделать просто число, то задача
сводится к представлению числа в различных системах счисления.  Но
последовательность слишком длинная, в машинное число она не поместится,
а связываться с GPM неохота.

В связи с чем вопрос, нет ли какого-нибудь более простого способа.
Мне казалось как-то с остатками можно сделать.  Но раскодировать остатки
пока не получилось.-)

    // Далее последовательность нулей и единиц хранится в { bitc, bitv[] }.

    // base62
    void put_digit(int c)
    {
	if (c < 10)
	    putchar(c + '0');
	else if (c < 36)
	    putchar(c - 10 + 'a');
	else if (c < 62)
	    putchar(c - 36 + 'A');
    }

    v = 0;
    for (i = 0; i < bitc; i++) {
	v = (v << 1) | bitv[i];
	while (v >= 62) {
	    int q = v / 62;
	    int r = v % 62;
	    put_digit(r);
	    v = q;
	}
    }
    if (v)
	put_digit(v);
    putchar('\n');

----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 198 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20100805/ec4cdc5a/attachment-0001.bin>


Подробная информация о списке рассылки Devel