C # Сжать строку символов - PullRequest
0 голосов
/ 13 июля 2011

Скажем, 1 символ равен 1 байту, поэтому у меня есть 10 символов, а это 10 байтов.

У меня есть предложение, которое содержит 20 символов, и мне нужно загрузить это предложение на сервер. и ограничение составляет всего 10 байт, как мне сжать это предложение, которое составляет 20 байт до 10 байт.

В любом случае я могу сделать это через C #?

EDIT

У меня есть предложение из 170 символов, мне нужно сжать его так, чтобы оно походило на 130 символов. Я загружаю это предложение на сторонний сервер, поэтому я не имею никакого контроля над сервером. Можно ли это сделать?

Ответы [ 5 ]

2 голосов
/ 13 июля 2011

Ну, вы не можете сделать это гарантированно , нет.Существует гораздо больше возможных последовательностей из 20 байтов, чем последовательностей из 10 байтов, поэтому вы не можете сжимать каждую последовательность из 20 байтов обратимо в 10 байтов.

В общем случае сжатие не выполняется.Обычно он не очень хорошо работает с очень малой длиной ввода.

Если вы знаете, что весь ваш ввод будет на самом деле будет (скажем) AZ и пробел (то есть 27 символов), то это 5 бит... так что вам нужно всего 100 бит.Это все еще немного больше, чем 80 бит, которые вы имеете в наличии, так что вы все еще не можете гарантировать для представления всех предложений.Вы могли бы сделать «обычные» символы короче, чем «необычные» символы, и заставить многие предложения работать таким образом.

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

1 голос
/ 13 июля 2011

То, что вы хотите, должно быть возможным в большинстве случаев, но я могу гарантировать проблемы. Если вы написали метод, использующий класс GZipStream , он мог бы взять имеющуюся у вас 170-байтовую строку и уменьшить ее. Как говорило большинство людей, степень сжатия действительно зависит от самого контента.

Так же, как тест: Я взял строку «0123456789», повторяющуюся 17 раз (для 170 символов), сжал ее и уменьшил до 21 символа.
Если я возьму строку из 170 нулей и скопирую ее, она будет уменьшена до 12 символов. Я взял 170 байтов случайного кода, и он сократился до 79 символов.

Так что в этих случаях он сжал бы его, чтобы он соответствовал вашим требованиям к пространству; но нет способа предсказать, когда и как часто это не произойдет. Степень сжатия может в конечном итоге составить 1: 1, и при создании блочной структуры возникают накладные расходы, поэтому это может привести к сжатой длине, немного превышающей исходную. Опять же, вам может понадобиться кодировать base64 целиком, чтобы правильно хранить его в БД, чтобы это еще больше увеличило ваши накладные расходы.

1 голос
/ 13 июля 2011

У вас здесь серьезная проблема. Двадцать байтов это 160 бит, это 2 ^ 160 возможных сообщений. Десять байтов - это 80 бит, это 2 ^ 80 возможных сообщений. Если у вас нет способа уменьшить пространство исходного сообщения до содержания только 2 ^ 80 возможных сообщений, вы не сможете сделать это.

1 голос
/ 13 июля 2011

Вы не можете, степень сжатия зависит от содержимого самой строки. И даже если вы можете сжать последовательность, вы должны также выполнить декомпрессию на сервере. Но если у вас есть доступ к серверу, вы можете просто разделить последовательность на несколько частей.

0 голосов
/ 13 июля 2011

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

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