Вот очень неэффективная схема, о которой я только что подумал -
Предположим, ваше исходное сообщение состоит из следующих байтов a(1),a(2),a(3),...,a(n)
, к которым вы добавляете очень сильный код исправления ошибок a(n+1),a(n+2),a(n+3),...,a(n+m)
. Теперь отправьте это сообщение с чередованием с потоком 1,2,3,4,5 ..., то есть отправьте:
1, а (1), 2, (2), ..., п, (п), п + 1, а (п + 1), ..., п + т, а (п + м)
На принимающей стороне сообщения ищите блоки последовательных байтов вида k,S,k+1
. Это говорит о том, что a (k) = S. Более того, если вы видите два триплета i,S,i+1...k,T,k+1
и нет j,P,j+1
между этими двумя так, что i<j<k
, предположим, что вы потеряли все байты между i-м и k-м байтами в исходном сообщении и напишите нули на месте.
Используя эту схему, вы можете выбросить некоторые байты, которые фактически прошли, но, по крайней мере, вы будете уверены, где разместить некоторые байты. Затем вы можете использовать свой очень сильный код исправления ошибок, чтобы заполнить потерянные байты и исправить ошибки в тех байтах, которые вы фактически записали.
(* Чтобы это работало аккуратно, вы также должны быть уверены, что байты сообщения не могут быть перепутаны с байтами чередующейся последовательности, но это легко решить с помощью преобразования - например, base64 ваших байтов перед передачей поэтому их MSB равен 0 и чередуют их с байтами, MSB которых установлен в 1)