Игнорирование первого байта, ограничение, что вы не можете иметь повторяющиеся байты, означает, что каждый байт представляет выбор 1-в-255, а не один-в-256.Это означает, что вы можете отправлять чуть менее 8 бит на байт (7,994353 бита)
Следовательно, теория кодирования говорит нам, что вам необходимо преобразовать входной поток из 256 символов в поток из 255 символов.Затем вы кодируете этот поток из 255 символов, вспоминая предыдущий отправленный вами байт.Если символ, который вы хотите отправить, меньше, чем предыдущий отправленный вами байт, вы отправляете его без изменений, иначе вы отправляете его + 1.
Алгоритм декодирования является обратным.Если вы получите байт, который больше, чем ранее полученный байт, вычтите один.
В качестве простого примера рассмотрим отправку 254 254 254
.Первый может быть отправлен сразу (первый символ), второй будет отправлен как 255 (+1), а следующий будет снова 254.Таким образом, получатель видит 254 255 254
.Единственный байт, который выше, чем предыдущий, это 255, поэтому вычтите один из этого, чтобы восстановить начальную последовательность 254 254 254
.
Это кодирование является наиболее эффективным из возможных, у нас просто небольшая проблема отображения случайного числапоток байтов (256 символов) в поток из 255 символов.Помните, что в этом 255-символьном коде дубликаты допускаются .Вот почему мы это изобрели.
Один простой, но неэффективный хак - заменить 254
на 254 0
и 255
на 254 1
.Недостатком является то, что он эффективно использует 15,998 бит для этих двух входов.Один сложный, но совершенно неэффективный способ взлома состоит в том, чтобы рассматривать весь ввод как число с базовым 256 и преобразовывать его в число с базовым значением 255.
Что именно вы выберете, вероятно, зависит от вашего ввода.