Как кодировать последовательность байтов, чтобы избежать повторений? - PullRequest
0 голосов
/ 05 июня 2018

Существует проблема, которую в настоящее время я не могу решить и мне нужна помощь.

У меня есть передатчик и приемник.Передатчик должен передавать случайную последовательность байтов (с возможными повторениями) или неизвестной длины.Последовательность может быть преобразована (закодирована) перед передачей, если нам нужно.

Приемное устройство получает последовательность байтно.Настоятельно требуется не иметь повторяющихся байтов во входящей последовательности.Каждый новый байт должен отличаться от предыдущего принятого.

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

Я слышал о скремблерах.Как я понимаю, некоторые из них могут выводить последовательность байтов без повторений.Но есть ли какой-нибудь более простой способ?

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Ребята, что вы думаете об идее использовать какой-нибудь мягкий байтовый скремблер?Я имею в виду какой-то простой алгоритм, который преобразует исходный поток байтов в псевдослучайную последовательность без повторений?

Можно ли таким образом надежно избежать повторений?

Просто хотелось бы узнать его как дополнительный возможныйрешение ...

0 голосов
/ 05 июня 2018

Игнорирование первого байта, ограничение, что вы не можете иметь повторяющиеся байты, означает, что каждый байт представляет выбор 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.

Что именно вы выберете, вероятно, зависит от вашего ввода.

0 голосов
/ 05 июня 2018

Простой подход состоит в том, чтобы просто использовать старший бит для уникальности и младшие 7 бит для переноса данных:

0xxxxxxx 1xyyyyyy 0yyzzzzz 1zzz....

Это кодирует каждые 7 байтов ввода как 8 байтовна связи.На отправителе у вас есть один бит состояния для переключения между 0 и 1 и счетчик 0-6 для переменных битовых смещений.На приемнике вам даже не нужно декодировать верхний бит, поэтому у вас просто есть счетчик 0-6, чтобы обратить битовые сдвиги.С обеих сторон вам также необходимо сохранить часть одного байта, поэтому для этого вам потребуется около 2 байтов состояния.Тем не менее, не так уж плохо и, безусловно, выполнимо в FPGA или около десятка инструкций ARM.

0 голосов
/ 05 июня 2018

Вы можете отправить данные в виде дополненной группы из 8 байтов с 7 байтами данных и одним специальным байтом, который имеет 7 битов для установки 0 или 1, зависит от того, требуется ли для изменения соответствующий байт данных (xor с FF или чем-то)сделать их отличными от предыдущих.Последний бит используется для того, чтобы этот байт отличался от последних данных.

исходные данные:

0x00 0x00 0x00 0x00 0x00 0x00 0x00

пакет:

0x00 0xFF 0x00 0xFF 0x00 0xFF 0x00 0b01010100 <- last bit would be flipped if previous data byte is the same as this byte

Примечание: если у вас нетВ буфере на 8 байтов вы можете отправлять байт заполнения, сначала сохраняя его в регистре, сдвиг влево / вправо и обрабатывая следующий байт на основе значения бита.

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