Сделайте пользовательский кодировщик строки .net - PullRequest
2 голосов
/ 21 февраля 2010

Я знаю .net поддерживает base64-кодирование байтовых массивов. Но я подумал, что смог бы сэкономить еще больше места, если бы использовал большее количество символов. Я где-то читал, что Unicode поддерживает тысячи различных символов, так почему бы не использовать, например, кодировку base1024? И если это возможно, вы можете дать некоторые рекомендации о том, как это реализовать. Спасибо

Ответы [ 4 ]

12 голосов
/ 21 февраля 2010

Base64 существует для цели: хранить / передавать двоичные данные в формате, который умещается в 6 бит / символ, чтобы обойти ограничения, налагаемые некоторыми протоколами. Если у вас нет таких ограничений, base64 не для вас. Он никогда не предназначен для экономии места. Если вам нужно сэкономить место и вы можете использовать что угодно, просто сохраните массив в виде двоичных данных.

3 голосов
/ 21 февраля 2010

Цель base64 - избежать проблем с кодировкой. Практически все работающие машины согласуются с набором символов ASCII. Хотя, вероятно, еще есть несколько машин EBCDIC, потребляющих киловатты. ASCII кодирует только 96 однозначных символов. Base64 использует 64 из них, плюс символ заполнения. Base128 уже слишком много.

В Unicode нет ничего однозначного, чаще всего используются кодировки UTF7, UTF8, UTF16, UTF32, UCS-2 и их наименее-порядковые и старшие-порядковые варианты. Base1024 потребует 1024 однозначных символов, что слишком много, чтобы кто-нибудь когда-либо согласился. Обратите внимание, что это не может быть просто закодированный диапазон, в диаграммах Unicode есть много дыр, и они распределены случайным образом.

0 голосов
/ 01 марта 2010

В зависимости от того, используете ли вы 2-байтовую кодировку Unicode (UCS2) или многобайтовую (UTF-8). База 1024 будет лишь немного лучше или даже более бесполезной, чем база 64, поскольку база 64 использует 6 бит из 8-битного байта. Необработанные двоичные данные, преобразованные в base64, становятся на 4/3 больше. (рост примерно в 1.333 раза)

Но base1024, использующий UCS-2 (16-битные) символы Unicode, будет использовать только 10 из 16 битов, поэтому займет 8/5 места. необработанные двоичные данные, преобразованные в base1024 с использованием UCS-2, вырастут в 1,6 раза по сравнению с первоначальным размером. Это хуже , чем base64.

Если вместо этого вы использовали UTF-8 Unicode и осторожно использовали только символы Unicode с кодировкой 1 или 2 байта, вы можете получить не более 1920 уникальных кодовых точек из 2 символов, работает с небольшим улучшением плотности данных. (Кодирование UTF-8 использует только 6 битов каждого дополнительного * битового байта для обозначения кодовых точек, остальные 2 бита используются для указания того, что следуют дополнительные байты)

Так что это не поможет, вам следует изучить возможность сжатия ваших данных перед их преобразованием в base64.

0 голосов
/ 26 февраля 2010

Как уже упоминалось, base64 не экономит место. Он даже увеличивает количество символов, необходимых для того, чтобы содержать одинаковую информацию (посмотрите на wikipedia , чтобы увидеть, что три байта требуют четырех символов для представления).

Если вам действительно нужно сэкономить место и сжать байтовый массив, вам следует взглянуть на алгоритм LZMA . И если вам нужна реализация этого алгоритма на C, C ++, C # или Java, взгляните на страницу 7zip .

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