-1

В настоящее время я внедряю систему обмена сообщениями. Я хочу отправить сообщение с защитой от ошибок получателю, но я не сработал на основах, то есть вычислил коды, исправляющие ошибки. Для исправления ошибок я использую следующее: library.
Рассмотрим следующий MWE:Коррекция ошибок с помощью Python и Reed Solomon для больших входов

from reedsolo import RSCodec 

with open("imageToSend.png", "rb") as pic: 
    picContent = pic.read() 

correctionLength = int((len(picContent)/100)*20) 
rs = RSCodec(correctionLength) 

rs.encode(picContent) 

Как вы можете видеть, что я хочу, чтобы защитить изображение от 20% ошибок, которые могут произойти. Проблема здесь? Закодированный bytearray пуст. И мой вопрос: можно ли защищать большие файлы от ошибок, не разбивая их на более мелкие части, а затем вычисляя коды, исправляющие ошибки?

+0

Об избирателях: Здесь нет ничего слишком широкого. – deviantfan

+0

Если вы не против накладных расходов на копирование/разделение данных в матричный формат, может быть использована двухуровневая схема обнаружения/коррекции. Строки будут содержать байты CRC или RS ECC для обнаружения ошибок, и в матрице будут добавлены строки RS ECC для исправления стираний, обнаруженных CRC/RS ECC, ориентированных на строки, для исправления только одной строки четности на каждую ошибочную строку. Перемещение может использоваться для борьбы с большими отсева. – rcgldr

ответ

1

Is it possible to protect large files from errors, without chunking them into smaller pieces

В зависимости от кода. С bytewise RS необходимы куски (но этот lib работает для вас).

As you can see I want to protect the image from 20% errors that might occur. The problem here?

Да. В первую очередь это не означает, что это процентная вещь. Вы действительно должны прочитать примеры lib и немного узнать, как работает RS.
Число, которое должно быть использовано для исправления ошибок, должно быть указано в байтах из 255. Например. 40 означает, что для каждого 215-байтового данных будет 40-байтовый код RS (около 20%), а в этом 255 байтах он может исправить ошибку до 20 байтов.

И, наконец, принцип LDPC может быть чем-то, что вы хотите изучить. Немного хуже, чем RS в исправлении ошибок, но ноч много, и это намного быстрее.

Дополнение от комментариев:
Если его можно исправить, зависит от местоположения ошибки, да. Если полные 255 блоков исчезли, он не сможет исправить это. Чтобы увеличить масштаб, можно использовать коды RS-кода более высокого порядка (например, один независимый блок может иметь 65536 байт вместо 255), , но a) это снова намного медленнее, чем (уже медленный) 255-RS, и b) Я знаю, что RS libs не может этого сделать (ваш inslded). Вы должны написать это сами.

Опять же, LDPC может помочь, если это вас не беспокоит, что это совсем другая вещь. Например. он не имеет четких значений, сколько ошибок слишком много для исправления/обнаружения, это также зависит от шаблона ошибки. И поскольку он новее RS, в Интернете меньше кодов/библиотек, возможно, для вашего дела нет.

((Ну, это тоже старомодно, но на протяжении десятилетий его никто не интересовал, пока кто-то не понял, что это полезно)).

+0

Спасибо за объяснение - я действительно получил некоторую фоновую информацию неправильно или не получил достаточно ее, соответственно. У меня все еще есть два вопроса: вы, возможно, достаточно любезны ответить: 1) Предположим, у меня 1000-битный файл, и я установил код для исправления 40 (около 20% для каждого 215-байтового фрагмента). Затем я отправляю это большее сообщение получателю, но 20% персонажа меняются по пути («A» переключается на «Z» или «B» на «K» или что-то в этом роде). Должен ли он быть восстановлен? –

+0

2) Потому что, когда я пытаюсь сделать это как «Создание случайной строки из 100 символов», закодируйте его с помощью RSCodec (20) (что будет означать 20%, верно?), затем я беспорядочно переключаю 20 символов (общая длина остается неизменной), функция декодирования дает мне «reedsolo.ReedSolomonError: Не удалось найти ошибку». Это странно, правда? Или я до сих пор не понимаю, как это работает? –

+0

@JJAbrams ', который будет означать 20%, не так ли? Нет. В этом весь мой ответ. Это количество байтов в блоке 255 байтов из кода RS. Передача 20 означает, что для каждого 235 байтового данных дополнительно имеется 20-байтовый код RS, и в этой ошибке 235 + 20 байт может быть исправлена ​​ошибка до 10 байтов. Это около 4% от 255. Если вы действительно хотите исправить ошибки до 20%, вам нужно пройти 104. – deviantfan