кодирование — Reed Solomon или другой кодер и декодер FEC в переполнении стека

Я унаследовал проект PHP, который действительно мог бы извлечь выгоду из формы прямого исправления ошибок, поскольку он включает (потенциально) пользователей, печатающих в кодированной строке base64 бесконечно переменной длины. Эта строка разбита на группы по 6 символов в настоящее время для простоты транскрипции для человека и соединена вместе перед обработкой, но благодаря введению людей в уравнение ошибки могут и все-таки возникать.

Короткие строки, или те, что скопированы и вставлены, обычно хороши. Выбросы длинных, напечатанных вручную, — вот где реальная выгода будет видна.

Я остановился на том, что Рид Соломон является наиболее вероятным кандидатом для достижения этой цели (но я рад, что те, кто имеет более практический опыт, указывают на более подходящую FEC).

Кто-нибудь знает кодировщик и декодер RS с открытым исходным кодом, которые я могу использовать в этом приложении PHP? Я нашел несколько EN-кодеров, которые я, вероятно, могу взломать из библиотек QRCode, но декодер кажется мифическим. У меня, конечно, есть возможность взять несколько реализаций C и переписать их (я программист, а не специалист по математике, так что написание одной с нуля, вероятно, мне не под силу).

Данные в настоящее время выглядят так (только представление, вероятно, недопустимое base64!):

fD48Sa 483CDf 18ACDx UYh5jS PQXNT

Я бы хотел применить кодировку RS к каждому блоку после его разделения (удлиняя каждый блок, я принимаю это, и это будет приемлемо с точки зрения проекта), ИЛИ применять его до того, как строка будет разбита на блоки по 6 Из того, что я понимаю о RS, однако, это было бы более сложным вариантом, поскольку строка тогда не имеет фиксированной длины.

То, что я надеялся найти после наступления «эврики» с идеей FEC, было то, что позволило бы мне сделать это:

// messy encode pseudocode for demonstration purposes
$data    = "Once upon a time in a land far far away";
$encoded = base64_encode($data);
$split   = chunk_split($encoded, 6, ' ');

foreach($split as $chunk) {
$rsEncoded .= rsEncode($chunk) . " ";
}

и затем аналогичный rsDecode (), когда он вводится.

Любые намеки приветствуются …

0

Решение

Возможно, я неправильно понимаю вашу проблему, но это не похоже на хороший вариант использования для исправления ошибок вперед.

Прямое исправление ошибок полезно, когда известно, что сообщение корректно в тот момент, когда происходит кодирование. Ошибки, внесенные после этой точки, могут быть преодолены в процессе декодирования. Однако из описанного вами рабочего процесса звучит так, будто вы хотите закодировать сообщение. после того, как пользователь ввел его, что слишком поздно, чтобы обнаружить какие-либо ошибки в их транскрипции.

Вполне возможно, что вы на самом деле описываете получение блока кода Рида-Соломона, когда пользователь вводит свои данные, и используете проверочные символы из полученного блока кода для анализа своих данных. Если количество символов, которые различаются между введенными данными и полученным блоком кода, меньше, чем синглтон-граница вашего кода RS, это действительно позволит вам «исправить» ввод пользователя в сообщение, которое вы получили в первую очередь. Я не уверен, почему это было бы полезно, хотя.


Тем не менее, я считаю, что самый простой способ запустить RS в PHP — это вызвать реализацию Python из кода PHP.

В Викиверситете есть очень хорошо документированный кодер / декодер Python Вот, и еще одна обобщенная версия той же реализации Вот. Я обнаружил, что оба этих ресурса чрезвычайно полезны при написании моих собственных реализаций C ++.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]