[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