LINUX.ORG.RU

Как выявлять место ошибки при помощи контрольной суммы?

 , ,


0

1

Допустим, что человек должен ввести строку символов, напечатанных на бумаге в компьютер. Символы на бумаге напечатаны побайтно в виде пар шестнадцатеричных цифр и разделены пробелами. К каждой строке прилагается контрольная сумма для того, чтобы выяснить, не ошибся ли человек при вводе.

Вопрос: как сделать так, чтобы контрольная сумма показывала не только факт «строка введена корректно/некорректно», но так же и конкретно номер первого неправильно введённого символа?

Символов на строку пусть ограниченное количество, к примеру не более (80-N)/3 ~= 20..25.

«математика уровня младших классов школы» писали они…

Если это в принципе возможно, то почему ни один из форматов из колонки «File Formats» со страницы https://srecord.sourceforge.net/ так не делает?

Если это невозможно, то с чего бы это? Первое что приходит в голову, посчитать бит чётности в каждом байте, затем сконкатенировать. 24..25 битов / 4 ~= 6..7 шестнадцатеричных цифр. Да, контрольная сумма длинная, но довольно очевидно, что она сразу покажет, в каком байте что-то не так. Это показывает принципиальную возможность. Но наверное можно сделать контрольную сумму более короткой?

Уверен, что для младших классов это излишне круто. Вообще, когда речь идёт про вероятности возникновения и/или выявления ошибок, эти самые вероятности сразу переносят математику на уровень третьего курса ВУЗа.

Ещё есть такие слова как «локаторы ошибок» и «поиск Ченя» в википедии. Но для меня это сложные слова, нужно понятное объяснение.

★★★

Последнее исправление: Shushundr (всего исправлений: 4)

Стоит признать, что идиотских тем на ЛОРе всегда было предостаточно, но лишь ты сумел вывести их создание на новый, ранее недостижимый, я не побоюсь этого слова, элитный уровень.

thesis ★★★★★
()

Теперь по сабжу:

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

Тогда для проверки нужно, чтобы компьютер сравнил их с символами, которые он и передал в принтер для печати на бумаге, ХОБА!

thesis ★★★★★
()

Есть такой предмет «Теория информации и кодирования».

Ближайшее к твоей теме - коды Хемминга. Если брать 8 бит информации, то 1 доп. бит дает возможность обнаружить факт одиночной ошибки, а 3 бита дают возможность исправить одиночную ошибку и обнаружить двойную ошибку.

Это используется в ECC RAM.

vel ★★★★★
()

Вроде бы можно сделать подобное с помощью кода Рида-Соломона над полем Галуа GF(16). Текст нужно будет разбить на блоки по 15 (кажется) шестнадцатеричных цифр. В каждом таком блоке каждые две проверочные цифры будут исправлять одну искаженную цифру.

Например:

13 цифр полезной нагрузки и 2 цифры проверочных. Код будет исправлять одну искаженную цифру (не один бит, а цифру целиком) в любом месте блока.

11 цифр полезной нагрузки и 4 проверочных - исправляет 2 цифры и т.д.

loki231
()
Ответ на: комментарий от loki231

Я не очень понял. Я просил же не исправлять, а научить меня искать место опечатки человека. Конечно, если сравнить исходную строчку и исправленную, то та цифра, которая будет отличаться и будет показывать позицию.

Но вообще мне кажется, что для детектирования ошибочной позиции должно требоваться меньше избыточности чем для исправления.

Shushundr ★★★
() автор топика
Ответ на: комментарий от Shushundr

Ну так а локаторы ошибок — они именно про помехоустойчивое кодирование, оттуда же, откуда и исправление.

Код Рида-Соломона может быть систематическим или несистематическим. Если первое, то информация передаётся в неизменном виде, а прилагающиеся к нему коды действительно можно рассматривать как «контрольную сумму», правда, куда более объёмную, чем обычный MD5 или SHA*.

Если же вернуться к «обычным» контрольным суммам, которые, как тебе писали выше, тоже бывают разные…

она сразу покажет, в каком байте что-то не так.

Опять-таки с определённой вероятностью. Но конечно, сумму посчитать проще, чем эту вероятность определить.

Про «младшие классы», конечно, погорячились. То есть талантливый ребёнок, увлечённый математикой (даже не вундеркинд), возможно, сделает это и в младших классах. Но в общем и среднем тут надо знать и основы информатики, как биты складываются в байты, т.е. это либо очень добросовестный старшеклассник, либо таки вуз.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Но вообще мне кажется, что для детектирования ошибочной позиции должно требоваться меньше избыточности чем для исправления.

эквипенисуально. работа-то одинаковая. знание «что исправлять» равно знанию «как исправить».

pfg ★★★★★
()
5 февраля 2023 г.
Ответ на: комментарий от Shushundr

Я не очень понял. Я просил же не исправлять, а научить меня искать место опечатки человека.

Я конечно не программист но мне кажется что чтобы компьютер показал место ошибки он уже должен знать какое правильное значение там должно быть. И если это так то почему бы сразу не исправить?

PS. Ого! Оказывается я залез в старую тему…

ex-kiev
()
Последнее исправление: ex-kiev (всего исправлений: 1)