Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: LWhisper  
Дата: 17.05.16 12:22
Оценка:
Всем привет.

Есть небольшой массив байт — набор хэшей, длиной от 4 до 618 байт.
Нужно превратить его в UTF-8 строку. Если просто закодировать посредством Base64, получается слишком длинно.

Пока, думаю пожать его LZF и закодировать статичным словарём:
"!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁł"

Но, может быть, есть более эффективные способы кодирования?
Проверка целостности, обеспечиваемая Base64 не нужна.
base64 base256 строки кодирование
Re: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: BlackEric http://black-eric.lj.ru
Дата: 17.05.16 12:31
Оценка: :)
Здравствуйте, LWhisper, Вы писали:

LW>Но, может быть, есть более эффективные способы кодирования?

LW>Проверка целостности, обеспечиваемая Base64 не нужна.

Сжать 7z || zip, а потом в Base64. Компактно и надежно.
https://github.com/BlackEric001
Re: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: vmpire Россия  
Дата: 17.05.16 14:06
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Есть небольшой массив байт — набор хэшей, длиной от 4 до 618 байт.

LW>Нужно превратить его в UTF-8 строку. Если просто закодировать посредством Base64, получается слишком длинно.
Есть Base85, например.
Но непонятно, нужно ли это вообще, если массив и так небольшой.
Подумайте, имеет ли смысл вообще экономить на спичках. Может, потери процессора окажутся болше, чем экономия памяти.

LW>Пока, думаю пожать его LZF и закодировать статичным словарём:

LW>"!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁł"
На таких которких данных сжатие особо не будет работать. Тем более, сжатие хэшей.

LW>Но, может быть, есть более эффективные способы кодирования?

LW>Проверка целостности, обеспечиваемая Base64 не нужна.
Base64 не проверяет целостность
Re[2]: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: LWhisper  
Дата: 17.05.16 15:28
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Есть Base85, например.

V>Но непонятно, нужно ли это вообще, если массив и так небольшой.
V>Подумайте, имеет ли смысл вообще экономить на спичках. Может, потери процессора окажутся болше, чем экономия памяти.
Base85 не подходит по той же причине, что и Base64 — удлинение исходной последовательности. Как минимум, хотелось бы получить эквивалентное число символов.
Небольшая потеря процессорного времени не так страшна, полученная строчка будет висеть в аттрибуте над помеченным типом, и, как следствие, чем короче она будет, тем лучше.

V>На таких которких данных сжатие особо не будет работать. Тем более, сжатие хэшей.

Вот тоже думаю, но поэкспериментирую.

V>Base64 не проверяет целостность

Имелась ввиду .NET реализация. Там есть проверка на кратность 4 и левые символы.
Re: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: Sinix  
Дата: 17.05.16 16:04
Оценка: +1
Здравствуйте, LWhisper, Вы писали:

LW>Есть небольшой массив байт — набор хэшей, длиной от 4 до 618 байт.

LW>Нужно превратить его в UTF-8 строку. Если просто закодировать посредством Base64, получается слишком длинно.

Начните с задачи. Если вот это "полученная строчка будет висеть в аттрибуте над помеченным типом" про исходники, то в инструментах общего назначения оно не сработает. В куче компаний исходники ограничены ascii, всё прочее — escaped.
Re[2]: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: LWhisper  
Дата: 18.05.16 07:41
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Начните с задачи. Если вот это "полученная строчка будет висеть в аттрибуте над помеченным типом" про исходники, то в инструментах общего назначения оно не сработает. В куче компаний исходники ограничены ascii, всё прочее — escaped.

Но я ведь сказал — UTF-8.
Re[3]: Кодирование массива байт в UTF-8 строку (альтернатива
От: Sinix  
Дата: 18.05.16 07:47
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Но я ведь сказал — UTF-8.

Ну так исходная задача какая? А то ты пока описал своё решение, которое тебя не устраивает, а саму проблему не расписал.

UPD: У Ayende куча постов на тему хранения текстов была. Навскидку:
свежие:
https://ayende.com/blog/173250/playing-with-key-generators
https://ayende.com/blog/173283/playing-with-key-generators-redux

остальное:
https://ayende.com/blog/posts/series/172705/the-importance-of-a-data-format-part-i-current-state-problems
https://ayende.com/blog/167137/shared-dictionary-generation
Отредактировано 18.05.2016 8:02 Sinix . Предыдущая версия .
Re[4]: Кодирование массива байт в UTF-8 строку (альтернатива
От: LWhisper  
Дата: 18.05.16 16:29
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Ну так исходная задача какая? А то ты пока описал своё решение, которое тебя не устраивает, а саму проблему не расписал.

Закодировать произвольную последовательность байтиков в максимальную короткую строчку в кодировке UTF-8.

S>UPD: У Ayende куча постов на тему хранения текстов была. Навскидку:

S> свежие:
S>https://ayende.com/blog/173250/playing-with-key-generators
S>https://ayende.com/blog/173283/playing-with-key-generators-redux

S> остальное:

S>https://ayende.com/blog/posts/series/172705/the-importance-of-a-data-format-part-i-current-state-problems
S>https://ayende.com/blog/167137/shared-dictionary-generation
Две последние статьи итересны, но не применимы в моей ситуации, а две первые заканчиваются на Base64, которая мне не подходит в связи с тем, что приводит к удлинению строчки.
Re[5]: Кодирование массива байт в UTF-8 строку (альтернатива
От: · Великобритания  
Дата: 18.05.16 16:58
Оценка: +1
Здравствуйте, LWhisper, Вы писали:

S>>Ну так исходная задача какая? А то ты пока описал своё решение, которое тебя не устраивает, а саму проблему не расписал.

LW>Закодировать произвольную последовательность байтиков в максимальную короткую строчку в кодировке UTF-8.
Это, надеюсь, просто этюд, а не реальная задача?
Если этюд, то читаем https://en.wikipedia.org/wiki/UTF-8 и выясняем, что нужно реализовать Base1112064 encoding.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Кодирование массива байт в UTF-8 строку (альтернатива
От: Sinix  
Дата: 18.05.16 17:08
Оценка: 3 (1) +2 :))) :))
Здравствуйте, LWhisper, Вы писали:

LW>Закодировать произвольную последовательность байтиков в максимальную короткую строчку в кодировке UTF-8.

Это не задача, это то, как вы собираетесь её решить.

Диалог примерно такой:

- 42! Ну, что скажете?
Вопрос-то в чём?
— 42!!
— Ну а поточнее?
— 42.000000!!!
— ок.



В общем от меня — ок.
Re[6]: Кодирование массива байт в UTF-8 строку (альтернатива
От: MozgC США http://nightcoder.livejournal.com
Дата: 18.05.16 17:27
Оценка: +2
Здравствуйте, Sinix, Вы писали:

S> — Ну а поточнее?

S> — 42.000000!!!

Вот это реально понравилось!
Re: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: Vladek Россия Github
Дата: 19.05.16 03:54
Оценка: +2
Здравствуйте, LWhisper, Вы писали:

LW>Есть небольшой массив байт — набор хэшей, длиной от 4 до 618 байт.

LW>Нужно превратить его в UTF-8 строку. Если просто закодировать посредством Base64, получается слишком длинно.
LW>Но, может быть, есть более эффективные способы кодирования?
LW>Проверка целостности, обеспечиваемая Base64 не нужна.

Сделай словарь (просто строковую константу в данном случае) из уникальных символов длиной в 256 символов — кодирование хэша будет заключаться в замене каждого байта символом из словаря с индексом равным значению байта; декодирование в присвоении значению байта индекса соответствующего символа в словаре.
Re: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.05.16 08:14
Оценка: +2
Здравствуйте, LWhisper, Вы писали:
LW>Но, может быть, есть более эффективные способы кодирования?
UTF-8 — уже и есть кодирование.
Самое плотное кодирование (7 бит на байт) достигается при использовании старшего 0.
Если речь о хороших хеш-кодах, то в них будет недостаточно избыточности, чтобы хоть какой-то алгоритм компрессии мог что-то из них выжать.
Поэтому жать ничем не надо. Просто берёте биты и пакуете их в UTF-8.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: Sinix  
Дата: 19.05.16 08:28
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Поэтому жать ничем не надо. Просто берёте биты и пакуете их в UTF-8.


Я скидывал выше ссылку с более подробным объяснением направлений, куда надо копать.
https://ayende.com/blog/173250/playing-with-key-generators
https://ayende.com/blog/173283/playing-with-key-generators-redux

Топикстартеру не подошло.
Re[2]: Кодирование массива байт в UTF-8 строку (альтернатива Base64)
От: WolfHound  
Дата: 20.05.16 08:31
Оценка: 6 (1)
Здравствуйте, Sinclair, Вы писали:

S>Если речь о хороших хеш-кодах, то в них будет недостаточно избыточности, чтобы хоть какой-то алгоритм компрессии мог что-то из них выжать.

Если хешей много и их порядок не важен, то можно их отсортировать после чего вычесть соседние друг из друга.
Тогда мы получим избыточность, которую можно сжать.
Степень сжатия зависит от размеров хешей и их количества.
Миллион CRC8 таким образом можно сжать очень сильно.
Сотню SHA256 сжать скорее всего не получится совсем. Миллион можно немного сжать, но не факт, что оно того стоит.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Кодирование массива байт в UTF-8 строку (альтернатива
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.05.16 09:09
Оценка:
Здравствуйте, WolfHound, Вы писали:
WH>Если хешей много и их порядок не важен, то можно их отсортировать после чего вычесть соседние друг из друга.
Так не получится. Речь не о хранении пачки хешей, а о представлении отдельного хеша.
WH>Тогда мы получим избыточность, которую можно сжать.
WH>Степень сжатия зависит от размеров хешей и их количества.
WH>Миллион CRC8 таким образом можно сжать очень сильно.
Массив CRC8 любого размера можно без потерь пожать до 32 байт, если неважен порядок и количество повторов. Коэффициент компрессии будет стремиться к бесконечности.
Но это не та задача, которую решает топикстартер.
UPD: хотя, может быть и та.
Если всё же речь именно о наборе хешей, то да — можно применять компрессию, основанную на знаниях особенностей. Отбрасывание информации о порядке следования уже даёт хорошую экономию — отсортировав хеши, мы уменьшим матожидание дистанции между ними в N раз по сравнению с полным разбросом. Т.е. для хранения разницы нам потребуется в среднем на log2(N) бит меньше.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Отредактировано 20.05.2016 9:12 Sinclair . Предыдущая версия .
Re[4]: Кодирование массива байт в UTF-8 строку (альтернатива
От: LWhisper  
Дата: 20.05.16 10:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>UPD: хотя, может быть и та.

S>Если всё же речь именно о наборе хешей, то да — можно применять компрессию, основанную на знаниях особенностей. Отбрасывание информации о порядке следования уже даёт хорошую экономию — отсортировав хеши, мы уменьшим матожидание дистанции между ними в N раз по сравнению с полным разбросом. Т.е. для хранения разницы нам потребуется в среднем на log2(N) бит меньше.
Именно та.
Всем спасибо, вопрос исчерпан.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.