Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Подскажите символьный паккер, лучше чем base64 (https://javascript.ru/forum/misc/29311-podskazhite-simvolnyjj-pakker-luchshe-chem-base64.html)

Deff 23.06.2012 06:47

Подскажите символьный паккер, лучше чем base64
 
Задача встала ужать строку для GET запроса

Подскажите паккер произвольной инфы в URI кодировку, лучше чем base64

Gvozd 23.06.2012 11:20

Цитата:

Сообщение от Deff
URI кодировку

1 байт кодируется 1-3 символами, в зависимости от самого символа
Цитата:

Сообщение от Deff
base64

1 байт кодируется 1,3333 символами, всегда.
возможно дополнительный оверхед в 1-2 символа на все сообщение

Так что с точки зрения занимаемого места base64 вроде как лучше

melky 23.06.2012 13:02

Цитата:

Сообщение от Deff (Сообщение 183435)
Задача встала ужать строку для GET запроса

Подскажите паккер произвольной инфы в URI кодировку, лучше чем base64

Base62
http://dean.edwards.name/packer/

или любая другая запаковка JS'ом не катит?

Deff 23.06.2012 15:28

melky,
Основа упаковки - валидное прохождение как URL строки

Цитата:

Сообщение от Maxmaxmахimus
Решение : отправить данные постом.

метод пост - не проходит, отсутствует поддержка
Цитата:

Сообщение от Дзен-трансгуманист
Если по выходному размеру, то в Base85

Пока - Ваше идея - самая терпимая

Deff 24.06.2012 03:26

Цитата:

Сообщение от Дзен-трансгуманист
Можно, конечно, предварительно рубануть еще энтропийным кодированием, типа Хаффмана... но это будет уже полный мар

Хаффмана попробовал, за счет ключа вырастает порой у мну ключ 200 - 250символов от строки, а максимальная строка порядка 2000 символов разрешенных

Да есть у мну самоделка-энтропийка, выигрыш ну 100 200 символов - но думал есть чо интересней, но крути не крути она оч близка к base64

Вот думаю попробовать сотворить LWZ в кодировке 64 (а не 256 (Мне нехватает 500 байт для счастья, вместо 2000 2500

Deff 24.06.2012 04:13

Дзен-трансгуманист,

Я вот отсель утаскивал => http://vr-online.ru/?q=content/szhat...khaffmana-1547

(*Онлайн пример давно не работает с год

если нужно есть символьная энтропийка-автомат но прим ~1.33 с исходной длины все одно увеличивает

Для коротких файлов - Хофман - не Айс нужен либо жесткий автомат либо словарь с заранее ограниченной длиной

Deff 24.06.2012 04:50

Цитата:

Сообщение от Дзен-трансгуманист
Максимум 2К ASCII-символов, я так понял?

Там зависит от браузера - но кроссбраузерный минимализм - именно этот * мну еще повоюет - и если не впишусь ( все ж 500 символов это 25%
то наверно другой вариант общения выбрать придется, наверно через прокси

Aetae 24.06.2012 05:13

Ну на край можно в 2 захода.(маразм крепчал=) )

Deff 24.06.2012 05:22

Цитата:

Сообщение от Дзен-трансгуманист
А сохраняется по-джаваскриптовски, то бишь в JSON. Просто и наглядно, но не так уж эффективно. Да и понятно, что дерево/словарь на себя одеяло потянут при малом размере источника - а в таком виде так и подавно.

Скрипты я не учитывал, - передавать ток значимые переменные, и архитектуру словара вложенностью скобок, но все одно он из-за деревянного словаря на этом размере эффект отрицательный

Deff 24.06.2012 05:26

Цитата:

Сообщение от Aetae
Ну на край можно в 2 захода.

там последовательная вложенность передачи запроса - скорость в квадрате бу падать...

Aetae 24.06.2012 11:11

А вообще гуглили по теме?
Вот например интересный топик http://forum.ixbt.com/topic.cgi?id=26:41000

Deff 24.06.2012 12:18

Цитата:

Сообщение от Aetae
Вот например интересный топик http://forum.ixbt.com/topic.cgi?id=26:41000

Ну про LWZ - я говорил - стадартный LWZ -кодирует инфу в байт, что не подходит - нун попробовать модифицировать его в кодировку base85 или base64

Deff 27.06.2012 22:13

Дзен-трансгуманист,
Да вроде получаецо: трансформируем в base 64, затем в LWZ по основанию 64, *щас упираюсь(точнее отложено) совместить без перехода в скрипте базе 64 в символьный вид(оставить чисто числовым массивом и тогда и lwz переделать на вход не символов, а массива цифр
Cжатие на длином тексте порядка двух
на коротком 1.4 (хотя тут на коротких наверно разброс поди

Deff 29.06.2012 14:42

Дзен-трансгуманист,
Гы тут суть чтобы свести именно LWZ по модулю 64, а не повторная трансформация через base64
Используемый base64
<script>
/**
*
*  Base64 encode / decode
*  [url]http://www.webtoolkit.info/[/url]
*
**/

var Base64 = {

	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;

		input = Base64._utf8_encode(input);

		while (i < input.length) {

			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);

			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;

			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}

			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

		}

		return output;
	},

	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;

		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

		while (i < input.length) {

			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));

			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;

			output = output + String.fromCharCode(chr1);

			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}

		}

		output = Base64._utf8_decode(output);

		return output;

	},

	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	},

	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}

		return string;
	}

}
</script>

LZW
<script type="text/javascript">
// LZW-compress a string
function lzw_encode(s) {
    var dict = {};
    var data = (s + "").split("");
    var out = [];
    var currChar;
    var phrase = data[0];
*!*
    var code = 256;
*/!*
    for (var i=1; i<data.length; i++) {
        currChar=data[i];
        if (dict[phrase + currChar] != null) {
            phrase += currChar;
        }
        else {
            out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
            dict[phrase + currChar] = code;
            code++;
            phrase=currChar;
        }
    }
    out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
    for (var i=0; i<out.length; i++) {
        out[i] = String.fromCharCode(out[i]);
    }
    return out.join("");
}

// Decompress an LZW-encoded string
function lzw_decode(s) {
    var dict = {};
    var data = (s + "").split("");
    var currChar = data[0];
    var oldPhrase = currChar;
    var out = [currChar];
    var code = 256;
    var phrase;
    for (var i=1; i<data.length; i++) {
        var currCode = data[i].charCodeAt(0);
        if (currCode < 256) {
            phrase = data[i];
        }
        else {
           phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
        }
        out.push(phrase);
        currChar = phrase.charAt(0);
        dict[code] = oldPhrase + currChar;
        code++;
        oldPhrase = phrase;
    }
    return out.join("");
}
</script>

Вообщем везде , где 256
Для этого Выход первичного base64 и вход LWZ нужно переделать под цифровой массив 0-63 - дабы не создавать лишней конверсии

Deff 29.06.2012 17:12

Цитата:

Сообщение от Дзен-трансгуманист
Да, это LZW, но он превращает одну строку в другую. То есть из юникода получается снова юникод. Зачем поднимать избыточность данных?

Это байтовый пакер, суть в том, что последующие фразы кодируюца двумя символами, при достижении двух -тремя - и т.д, основание - не суть... Код рабочий...*Давно рабочий
Цитата:

Сообщение от Дзен-трансгуманист
Да, это LZW, но он превращает одну строку в другую. То есть из юникода получается снова юникод. Зачем поднимать избыточность данных?

Суть в том, чтобы переделать из байтового, в 64 вход и выход!
Ну я почти добил(неделю назад, - *осталось переработать кривоватый собственный код, в чём собственно и траблы(трансформирующий выше приведенное) - общее сжатие из длинной исходной строки с последующим base64 + LWZ c основанием 64 порядка 70% , что вполне хватает для достижения нужного, но пока это для длинных строк(насколько ухудшается для более коротких, длинной в 2000 в 2500 пока, - это в полной мере не тестировал...
Скорости длинных строк - приличные, страница - менее секунды

Пока нет возможности добить до красоты кода, озадачили иной работой

Deff 29.06.2012 17:22

Цитата:

Сообщение от Дзен-трансгуманист
По отношению к кодам UTF-8 сжатие ощутимо лучше, чем по отношению к Base64.

у LWZ -при равных входной-выходной разрядности данных - на длинных строках сжатие порядка двух - независимо от входной разрядности,
это чисто за счёт статистики строки при нормальном распределении.(естественно при большей выходной разрядности, чем входной (*реально входная у нас 64 или 2 в 6 cтепени) - сжатие лучше, но последущее выкривлениее 256 в base 64 убьёт эту всю выгоду!

Deff 30.06.2012 01:23

Цитата:

Сообщение от Дзен-трансгуманист
Зависимо. Я пробовал 1-битную. Получилось хуже всего.

Ну это естественно, словарик то растёт, но при своём утверждении я его в расчет не брал - говоря о достаточно длинных тестах, где практически верно утверждение про двойку(В своих тестах тестировал кодирование/декодирование HTML страницы

Deff 30.06.2012 01:23

Цитата:

Сообщение от Дзен-трансгуманист
Мои текущие цифры таковы.

На самом деле входная последовательность(не считая точек и пробелов) двух байтовая и итоговый Вами продемонстрированный выход практически устраивает, не хватает тестов на реальной входной длине в 2000 2500 байт

Усложнять код не желательно, поскольку межфреймовый обмен может включать в себя и передачу длинных текстовых файлов, что оставляет пожелания достаточно высокой скорости кодирования декодирования

Deff 02.07.2012 04:25

Дзен-трансгуманист, +
Забавно (Но мну все таки ограничится LWZ - c выходом base64 (Да и по Вашим графикам - интересующий диапазон символьной длины дает прогресс ужатия при LZWR весьма небольшой, а поскольку процесс использования будет скорее всего циклическим и
с высокой скоростью - важна скорость кодирования/декодирования;

Deff 02.07.2012 12:04

Цитата:

"Исходный текст → URF → LZW → Base64"
- имхо такая цепочка уже реализована - пока меня - не устраивает

Из всего Вышепредложенного интерес остается к данной реализации:
Цитата:

Сообщение от Дзен-трансгуманист
UTF-8 → LZW → Base64: 32979 39864 2587 128719 507 (символов ASCII)

интересен итоговый рабочий код - сравнить со своими наработками.

Deff 02.07.2012 21:37

Цитата:

Сообщение от Дзен-трансгуманист
Что, вот прямо с моим фильтром?

Неть без Вашего фильтра естественно и до этой темы...
Цитата:

Сообщение от Дзен-трансгуманист
Тогда хотелось бы знать, каковы Ваши наработки.

Да я писал уже -что есть кривенький код base64 + LWZ c выходом в base64 * пробный Вариант практически устраивает, за исключением символьных преобразований первичного выхода base64 и входа LWZ - поправить пока руки не дошли

Deff 03.07.2012 01:58

Цитата:

Сообщение от Дзен-трансгуманист
А сейчас у меня куча разрозненных функций, которые пока нужно вызывать по отдельности.

Ыы - Аналогично ... Спасибо за сообщения ( а то тут корил себя...

Цитата:

Сообщение от Дзен-трансгуманист
Второй пункт необходим, потому что подобрать оптимальные параметры URF программным путем - это для меня пока что задача не из легких.


В принципе в Инете можно поискать скрипт частотного словаря (как то встречал даже онлайн Вариант (наш русский) )ява-скрипт) , именно благодаря ему ужимал css до невероятных значений при минимальном словарике - посколь после частотника сразу ясно на какие фразы мон плевать...

Deff 03.07.2012 02:31

Цитата:

Сообщение от Дзен-трансгуманист
Да, и забыл добавить, что все опции упаковки будут инкапсулированы в итоговую строку, так что эти детали передавать отдельно не нужно - распаковщику они станут известны автоматически.

Cобственно чем и прельщает LWZ,

Про частотный словарик, тот что видал, был безотносителен () к буквам или цифрам - выдает Весь входной контекст отсортированный по повторяемости (но входной контент там имхо был ограничен до 20-30 кБ - работал минуты

Оч удобен для построения автоматов

Deff 03.07.2012 02:58

Цитата:

Сообщение от Дзен-трансгуманист
ак что эти детали передавать отдельно не нужно - распаковщику они станут известны автоматически.

Я про этот пункт

Deff 03.07.2012 03:02

Дзен-трансгуманист,
У нас легкое логическое недопонимание - собственно я подчеркнул - Да
Цитата:

Сообщение от Дзен-трансгуманист
Да, и забыл добавить, что все опции упаковки будут инкапсулированы в итоговую строку, так что эти детали передавать отдельно не нужно - распаковщику они станут известны автоматически.

Это действително Важно, чем и прельщает LWZ (в прошлом времени пока не говорю - прельщало - посколь ....

Deff 04.07.2012 09:28

Дзен-трансгуманист, +
Ну собственно почти готовая статья для Хабра
1. Паккер
2. Паккер, - как возможная замена json + упаковка кодирование куков авторизации (сейчас base64)
3. Кроссбраузерная организация куков с многоязыковой поддержкой без увеличения объема (у ИЕ ограничение в 4кило на домен
4. Увеличение скорости обмена при Кроссдоменном Аяксе на фреймах через Хеш

Deff 04.07.2012 11:41

Дзен-трансгуманист,
Мну все таки считает
а) под Куки оч полезна + доп шифровка авторизации,
Куки оч небольшой контент - время не думаю что сильно возрастет -сейчас установка кука 10-20ms, *все таки куки наиболее и кроссбраузерно используемый способ передачи небольших объемов меж страницами
Типовая востребованная задача пользовательских скриптов
b)
Цитата:

Сообщение от Deff
при Кроссдоменном Аяксе на фреймах через Хеш

Cкорость ответа та же, что и при Post запросах, но на коротких текстах - как правило, - скорость архивирования выше, думаю суммарное увеличение скорости будет именно в коэффицент ужатия (ранее вообще через URL Encoding

Deff 04.07.2012 12:47

Цитата:

Сообщение от Дзен-трансгуманист
3, true 2052 1.261 ( -20.680 % ) 2.898 ( -65.493 % ) **

:) Ксать интересуют замеры по времени для 1000 строк pack/unpack

Deff 04.07.2012 13:00

Цитата:

Сообщение от Дзен-трансгуманист
Deff, завтра мерить буду. Какой размер на вход нужен?

примерно 2000-2500 байт

Deff 04.07.2012 13:03

Цитата:

Сообщение от Дзен-трансгуманист
Обфускация - в какой-то степени да. Но шифровка ли? Тупо вызвал функцию - и сиди читай на здоровье.

там сейчас сделано сокращением base 64 до 40-50 символов со случайной выборкой ) собственно и сама авторизационная запись - изначально случайный набор символов

Deff 04.07.2012 13:23

Дзен-трансгуманист,
Мну точно не нает пока..
По частоте использования:
а) Вероятно HTML контент страницы вышеуказанными кусками
b) Скрипты
b) Чисто текст (наверно русский

Deff 04.07.2012 14:32

Цитата:

Сообщение от Дзен-трансгуманист
Для чего всё это, если не секрет?

Кросс Аякс межфреймами - я уже описывал

Deff 05.07.2012 10:49

Дзен-трансгуманист,
:cray: (*Сочуйствую

Deff 06.07.2012 01:28

Дзен-трансгуманист,
с 10(Опера) всё шустрее
И час дам ссылку про скорость ....(для мну была актуальна)
http://javascript.ru/forum/misc/2945...a-raznica.html

Ксать скрипты похоже из передачи отвалились(посколь удобнеее ссылкой на внешний файл передать

Deff 06.07.2012 01:44

Цитата:

Сообщение от Дзен-трансгуманист
В FF 3.6: кодирование 8-15 мс, декодирование 13-20 мс *.

В принципе уже устраивает...
А осел завсегда был медленней(хотя есть исключения) в три -пять раз

Aetae 07.07.2012 06:06

Ошибки надо кидать если это ошибки.)

Deff 07.07.2012 11:24

Цитата:

Сообщение от Дзен-трансгуманист
ошибки в самом содержании строки.

Мон подробней эту часть?

Deff 07.07.2012 18:10

Дзен-трансгуманист,
На счет параметров - утверждения достаточно ясны, - хотя имхо - мну инструкций думаю достаточно
Если речь о битом входном файле, - ну как в rar, код ошибки

Цитата:

Сообщение от Дзен-трансгуманист
Во всяком случае при распаковке возможны две ситуации с ошибками: а) неверные аргументы;

аргументы желательны максимально минимизированы в контексте сжатого файла - либо если длинные увы тогда в опциях, посколь при короткой строке(2000) достаточно расточительно...

Собственно мну нужен символьный одно-двух байтовый вход и 64символьный выход
если можно версию об одном двух - входных параметрах

Deff 07.07.2012 18:45

Цитата:

Сообщение от Дзен-трансгуманист
Вопрос как эту ошибку лучше возвращать? Варианты я перечислил, просто не знаю, как будет правильно.

Посколь типичный выход у нас символьный - удобнеей всего приделать подобное кукам
там если кука нет или кривой - значение false
перво наперво идет проверка(про куки
a=getCookie('name')
if(a) { и далее обработка
==============
if(a==false){var b=getError()

Deff 07.07.2012 19:31

Дзен-трансгуманист,
да блин - опять эта логика недопонимания - я про сделать аналогично!
Цитата:

Сообщение от Deff
удобнеей всего
приделать подобно кукам

там если кука нет или кривой - значение false
перво наперво идет проверка(про куки
a=getCookie('name')
if(a) { и далее обработка
==============
if(a==false){var b=getError()








Цитата:

a=getDsenPacker(str)
if(a) { и далее обработка
==============
if(a==false){var b=getErrorPacker()


Часовой пояс GMT +3, время: 08:29.