Двоичное кодирование длины прогона

У меня есть веб-форма, для содержимого которой я хотел бы сгенерировать краткое представление в Base64. Форма, помимо прочего, содержит список из 264 двоичных значений, большая часть которых будет равна 0 в любой момент времени. (Они представляют регионы на географической карте). Даже в Base64 это 264-битное число создает длинную устрашающую строку. Я хочу реализовать кодирование длин серий как можно более эффективно. ты можешь помочь мне с этим? Я погуглил двоичный RLE, но не нашел ничего полезного.

То, что я пробовал до сих пор - запуск RLE для двоичной строки с использованием десятичных чисел и «A» в качестве разделителя, обозначающего изменение между 0 и 1, а затем преобразование результата из базы 11 в базу 64. Для пример:

00000000001111111000000010000000000000000000000001111111110001111010101000000000000000000000000000000000000111111111110111000000000000111111100000001000000000000000000000000111111111000111101010100000000000000000000000000000000000011111111111011100

становится

10A5A5AA22A7A1A2AAAAAAA34A9AA1A10A5A5AA22A7A1A2AAAAAAA34A9AA1A

, что, в свою очередь, становится

CNnbr/FxkgbbOw0LNAKgk65P8SdvaTG+t74o

или, в базе 62,

6imo7zq1pqr2mqglTHzXwJRAksm7fvHZHWQK

Это лучше, но я все еще не могу не сомневаться, что я делаю что-то не так - это цифра " Лучше всего это сделать с помощью разделителя?

И еще одно обновление:

Благодаря @comingstorm я еще немного сократил сжатую строку.

ILHHASCAASBYwwccDASYgAEgWDI=

Как я уже упоминал в комментариях, реальные варианты использования обычно приводят к еще более короткой строке.

5
задан avramov 30 September 2011 в 07:37
поделиться