Я унаследовал проект 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 (), когда он вводится.
Любые намеки приветствуются …
Возможно, я неправильно понимаю вашу проблему, но это не похоже на хороший вариант использования для исправления ошибок вперед.
Прямое исправление ошибок полезно, когда известно, что сообщение корректно в тот момент, когда происходит кодирование. Ошибки, внесенные после этой точки, могут быть преодолены в процессе декодирования. Однако из описанного вами рабочего процесса звучит так, будто вы хотите закодировать сообщение. после того, как пользователь ввел его, что слишком поздно, чтобы обнаружить какие-либо ошибки в их транскрипции.
Вполне возможно, что вы на самом деле описываете получение блока кода Рида-Соломона, когда пользователь вводит свои данные, и используете проверочные символы из полученного блока кода для анализа своих данных. Если количество символов, которые различаются между введенными данными и полученным блоком кода, меньше, чем синглтон-граница вашего кода RS, это действительно позволит вам «исправить» ввод пользователя в сообщение, которое вы получили в первую очередь. Я не уверен, почему это было бы полезно, хотя.
Тем не менее, я считаю, что самый простой способ запустить RS в PHP — это вызвать реализацию Python из кода PHP.
В Викиверситете есть очень хорошо документированный кодер / декодер Python Вот, и еще одна обобщенная версия той же реализации Вот. Я обнаружил, что оба этих ресурса чрезвычайно полезны при написании моих собственных реализаций C ++.
Других решений пока нет …