Задать вопрос
Kalombyr
@Kalombyr

Есть ли алгоритм кодирования, который не допускает подряд 3-6 одинаковых значений?

Здравствуйте!
Два устройства общаются через com-порт. Пусть будут Arduino, т.к. тестирую на них.
Нужно как-то отделять пакет от пакета, при условии, что в потоке возможны искажения. Понятно дело, контрольные суммы, контроль чётности и т.д.
Но вот встал вопрос, как лучше разделять "пакеты" (последовательность байт) ?
Пока что ставлю подряд 3 нуля. В идеале, ищу какой-либо простой и быстрый алгоритм кодирования/декодирования байт, который бы позволил избежать несколько подряд (ну скажем от 3 до 6) одинаковых фиксированных значений (то есть мне нужно заранее знать, что бы его поставить разделителем)
Думал просто к каждому третьему байту добавлять единицу, но тогда проблема: если искажение будет в нём при передаче и он станет равным 0.
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 3
dollar
@dollar
Делай добро и бросай его в воду.
Контрольная сумма (хеш).

Если искажение и будет, то шанс его не обнаружить - один на миллион (на самом деле ещё меньше, хотя зависит от разрядности).
Ответ написан
PavelK
@PavelK
Доброго дня.
Если я правильно понял, то, алгоритма то не требуется (можно применить сжатие LZW, но, боюсь, Ардуинка половину времени будет вычислять его, что явно не устроит).

По-моему, проще будет пробежаться по байтам и вместо 0 0 0 0 0 вставлять 0 N, где N - их количество (если не хотите возиться со сдвигом массива, то вместо остальных ставьте любое значение, потом только при парсинге поставите обратно).
Но вот если 0 действительно один, то всё равно придётся вставлять дополнительно 0 1, иначе будет не отличить где один, а где несколько.

И вообще "0" - хреновый разделитель, т.к., по-моему, самое часто встречающееся значение в потоке обмена. Лучше уж 42.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
одинаковых фиксированных значений
почему не хотите, чтобы они были разными?!)
Просто исключите нужную последовательность, используя её же в качестве xor-ключа (с повторами при превышении данными длинны ключа) при кодировании/декодировании данных.
В итоге: никогда не будет в последовательности данных пакета разделителя пакетов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@AlexSku
не буду отвечать из-за модератора
1) манчестерское кодирование
2) шина CAN (служебные биты автоматически следят за ошибками)
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Да ты правильно делаешь. В телеграфии и передаче данных - это единственный способ синхронизировать передатчик и приёмник. Договорись сам с собой что 3 нуля подряд + 3 единицы будут синхро-импульсом а дальше пойдут данные. Если будет сбой - значит был ложный синхроимпульс и надо ждать следующий.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы