Как перенести файл поверх ручки и бумаги, с исправлением ошибок

2030
Jeremy Salwen

Я ищу способ передачи файла, используя только ручку и бумагу.

Это несколько похоже на бумажный пакет, за исключением того, что плотность, которую я ищу, намного, намного ниже, и я не хочу использовать принтер или сканер.

Очевидно, первый ответ - кодировка Base64 . Но написание и чтение такого большого количества символов обязательно приведет к ошибкам. Для моих целей любая ошибка недопустима.

Второй ответ может быть кодами исправления ошибок Рида-Соломона (например, с использованием rsbep ). Однако это также проблема, потому что, насколько я понимаю, коды Рида-Соломона не исправляют ошибки вставки / удаления, которые в данном случае, вероятно, более вероятны, чем ошибки замещения.

Существует ли какая-либо программа, которая будет кодировать / декодировать произвольные файлы с помощью кодов, исправляющих ошибки с учетом вставки / удаления? Предпочтительно это должно работать на Windows, Linux и Mac OS X

Очевидно, что любое другое решение общей проблемы приветствуется.

22
Ожидаете ли вы ошибки в письме или просто в чтении? Christian Mann 12 лет назад 0
Я ожидаю ошибки в обоих, но я также ожидаю, что они будут эквивалентны ... Jeremy Salwen 12 лет назад 0
Ой, извини. Я неправильно прочитал и думал, что вы печатаете. Вы хотите написать это вручную? Christian Mann 12 лет назад 0
да, от руки (заполняя символьное ограничение этим паратентическим замечанием) Jeremy Salwen 12 лет назад 0
Сколько данных вы надеетесь закодировать таким образом? Чтобы минимизировать ошибки копирования, вам необходимо кодировать данные, используя легко идентифицируемые / различимые буквенно-цифровые символы. Это означает, что как минимум вам нужно использовать 2 символа для представления каждого байта. Предполагая, что вы можете разместить 400 слов на странице при средней длине слова 5 символов, вы получите только около 1 КБ данных на листе бумаги формата А4. Средний человек копирует со скоростью 22 слова (110 символов) в минуту. Таким образом, для копирования 1 МБ данных потребуется около 18 минут или около 13 дней (без сна) для копирования 1 МБ данных. И это без исправления ошибок. Lèse majesté 12 лет назад 0
Сколько цветов ручек я могу использовать? :) Der Hochstapler 12 лет назад 3
Только одноцветное перо, иначе расшифровать его будет слишком сложно. Я на самом деле передаю сжатый, подписанный, зашифрованный текст, поэтому при условии, что даже коэффициент избыточности составляет 50%, общий объем записи будет <в 1,5 раза больше, чем при фактическом выписывании исходного текста (если учесть сжатие ). Однако существует проблема, заключающаяся в том, что копирование случайных символов сложнее, чем копирование текста на английском языке. Таким образом, чтобы ответить на ваш вопрос, конечно, только в диапазоне пару кб. Jeremy Salwen 12 лет назад 1
Хм, на самом деле, я сделал небольшой тест с моим эссе. Исходное эссе: 14 116 байт => сжатый nanozip: 4 118 байт => закодированный base64: 5565 байт. с почти 50% избыточностью мы по-прежнему сократили количество копируемых символов в * половину *. На самом деле, если вы не любите копировать символы, но хотите вместо этого копировать текст, стенографически кодируйте его, используя http://www.fourmilab.ch/javascrypt/stego.html, все еще только увеличиваете размер примерно в четыре раза, поэтому у нас осталось эссе, которое в два раза больше нашего оригинала. Довольно хорошо, а? Jeremy Salwen 12 лет назад 0

5 ответов на вопрос

4
Tom Wijsman

Я сомневаюсь, otherwise transcribing it will be too difficultбудет ли проблема.

Допустим, у вас есть красный, зеленый, синий и черный. Вы можете написать скрипт, который превращает ваши данные в набор писем RGBY, например: RGBYGBRYBGBYRYYBYBRYYG(или даже Red Green Blue Black Green Blue Red Black...в лист Excel) и обратно. Это просто вопрос базового преобразования ваших двоичных данных из базы 2 (или шестнадцатеричных данных из базы 16) в базу в количестве цветов, которые вы берете (4 в этом примере).

Теперь самым логичным подходом было бы получить себе 16 цветов. Таким образом, вы должны использовать в 4 раза меньше точек, что делает переключение между ручками того стоит. Это позволяет вам записывать в 4 раза больше данных на бумаге, если вам нужно или, возможно, иметь, может быть в 4 раза менее точно при нанесении точек, масштабирование зависит от вас. Я бы действительно советовал не рисовать каждый бит.

Например, 5565 bytesпришлось бы умножить на два, чтобы получить количество шестнадцатеричных чисел, которое 11130 hexadecimals(в отличие от 44520 bits) может быть помещено в 106 x 106сетку.

В зависимости от типа данных вы можете прийти с некоторыми оптимизациями ...

Подсказка: попытайтесь выбрать наиболее четкие (наиболее контрастные) цвета ...

Альтернативы, которые могут использовать одну ручку:

  • Представляют различный шестнадцатеричном от различных символов -, /, |, \, +, ...

  • Представьте различные шестнадцатеричные числа маленьким пиксельным шрифтом, см. Мой аватар.

    Это делает даже полезным использовать что-то вроде Base 32 (или Base 36). Обратите внимание, что Qи 9совпадают, поэтому вам нужно, чтобы верхний правый пиксель Qбыл белым для четкого различия. Base 32 требует только 53 x 53сетку для вашего примера, плюс небольшой интервал между буквами.

Ну, есть несколько проблем с этим. 1. Я дальтоник 2. Требуется купить кучу ручек. 3. Это совсем не помогает с исправлением ошибок. 4. Это включает в себя написание кодов вместо текста, что людям хуже. Jeremy Salwen 12 лет назад 0
@JeremySalwen: Хм, написание символов в сетке не очень сложно. И вы можете исправить ошибки, написав некоторые дополнительные продольные контрольные числа или CRC. Но на самом деле, очень легко записывать буквы из сетки в сетку, в худшем случае вы просто повторяете это для подтверждения. Tom Wijsman 12 лет назад 0
@JeremySalwen: И если вы дальтоник, вы просто не берете цвета, для которых вы дальтоник. Tom Wijsman 12 лет назад 1
Дальтонизм - это скорее уменьшение размерности цветового пространства, чем избирательная неспособность видеть определенные цвета. Я имею в виду, я, вероятно, мог бы снять черный, синий, желтый, красный, зеленый, серый, но не намного Jeremy Salwen 12 лет назад 1
@Tom Вы, вероятно, должны положить свой старый аватар, чтобы избежать путаницы :) Nate Koppenhaver 12 лет назад 0
Готово, @NateKoppenhaver. : D Tom Wijsman 12 лет назад 0
2
Dour High Arch

Если вы хотите, чтобы люди могли читать и записывать данные, проблема с Base64 и многими кодировками текста заключается в том, что они используют такие символы, как I, l, 1, |, /, 0, O, o и т. Д., Что люди путают друг с другом.

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

Спасибо, я, вероятно, буду использовать это, но это все еще не решает проблему исправления ошибок. Jeremy Salwen 12 лет назад 0
@ Джереми, реализация Крокфорда включает обнаружение ошибок *. Если вам нужно исправить ошибки, изучите исправление ошибок вперед (http://en.wikipedia.org/wiki/Forward_error_correction). Dour High Arch 12 лет назад 0
1
Lèse majesté

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

Я бы порекомендовал, в соответствии с предложением Оливера, увеличить плотность данных, заимствуя страницу из шифра Бэкона, которую часто используют тюремные банды для кодирования скрытых сообщений в сообщениях, написанных в 2 разных стилях сценария - обычно либо верхний, либо верхний строчные или печатные или рукописные символы, например

Hey mOM, WHAT's FOR diNNeR TODAY? = ABBBA AAAAA BAAAB BAABA AAAAA = P A S T A 

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

Однако, поскольку все числа глифов больше 15 и меньше 256, по существу, одинаковы для прямого шифра двоичных данных (то есть вам по-прежнему нужно 2 символа для представления каждого байта, что дает плотность данных 4 бита на символ в во всех случаях), вы можете использовать дополнительные 98 глифов / 12740 кодовых точек для обнаружения / исправления ошибок.

Способы сделать это включают в себя:

  • Выберите набор из 256 самых простых для чтения / записи комбинаций символов. Если возникает какая-либо другая комбинация символов, вы знаете, что это ошибка копирования.
  • Используйте две версии конечного символа в качестве бита четности.
  • Создайте 50 различных 16-символьных наборов глифов. Затем вы можете использовать их для шифрования данных для исправления ошибок.

    Например, следующие 3 полубайта равны 0x000, равны 0x001и т. Д.

    Вы можете использовать это для представления 2500+ из 4096 возможных 1,5-байтовых значений. Точно так же вы можете использовать только 16 наборов для представления всех значений следующего байта, обеспечивая 100% избыточность без увеличения длины закодированных данных.

Кроме того, вы можете использовать дополнительные глифы для дополнительного сжатия:

  • Реализуйте кодирование переменной ширины, выбрав 98 односимвольных кодовых точек. Это уменьшит средний размер закодированного контента примерно на 20%.
  • Реализуйте что-то похожее на кодирование по длине прогона, используя различные наборы глифов или комбинации наборов глифов для представления повторяющихся кусков / байтов. Например, Ab= aba; aB= abab; AB= ababab...
  • Используйте дополнительные символы или кодовые точки для представления «слов» и «фраз», которые повторяются в ваших данных. Хотя предварительно сжатые данные, вероятно, будут иметь высокий уровень энтропии, поэтому я не знаю, насколько это будет эффективно.


Чтобы еще больше уменьшить количество ошибок при копировании, я бы отображал закодированный контент в виде линий сетки и копировал их на графике. Если вы можете использовать нестандартный бланк, который имеет чередующиеся цвета столбцов / строк, или клетчатую сетку в шахматном стиле с буквенными столбцами и пронумерованными рядами для быстрого поиска, это еще больше повысит точность копирования.

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


Хотя, если ваш главный приоритет - точность, я бы использовал двоичное кодирование + код Хэмминга . Используя сокращенный (12, 8) код Хэмминга на стандартной графической бумаге, вы можете разместить только 187 байтов, кодируя только 124 байта данных. Но это может быть очень быстро расшифровано (косая черта для 1, ничто для 0) и обеспечить единственное исправление ошибки. Установка дополнительного бита четности (13, 8) обеспечит SECDED (исправление одиночной ошибки, обнаружение двойной ошибки). Используя стандартный код Хэмминга, такой как (15, 11) или (31, 26), вы получаете еще большую эффективность с 137 и 156 байтами данных на лист соответственно. Еще более высокая скорость кодирования может быть достигнута, в зависимости от того, насколько точным, по вашему мнению, может быть ваш транскрибер.

Бинарное кодирование также будет легче читать (вслух) и OCR / OMR.

Очевидно, я планирую использовать и заглавные буквы. Из всех предложенных вами схем исправления ошибок я не вижу способа реализовать их без разработки собственного формата файла и т. Д. Неужели не существует прецедента для установки защиты файлов с исправлением ошибок? Возможно, я должен был также упомянуть, что создание пользовательских программ также крайне нежелательно? Кажется, я не могу найти программу, которая просто защитит ваши файлы с помощью кодов, исправляющих ошибки. Jeremy Salwen 12 лет назад 0
Моя точка зрения заключалась не в том, чтобы использовать только заглавные буквы, а в том, чтобы использовать разные скрипты / шрифты. Если вы используете только прописные и строчные буквенно-цифровые символы, у вас будет только 62 символа или 3844 кодовых знака. Вы можете получить более чем в три раза больше кода, используя 2 сценария, воспользовавшись носителем данных, используемым для передачи, что и было целью моего ответа. Если вы не хотите использовать тот факт, что это письменный носитель, существует множество форматов файлов, в которых реализовано кодирование ошибок. Большинство форматов архивирования / сжатия имеют встроенную функцию исправления ошибок. Lèse majesté 12 лет назад 0
Я не уверен, что вы имеете в виду, создавая новые форматы файлов, хотя. Все методы, которые я упомянул, предназначены для визуального кодирования произвольных двоичных данных в рукописный текст / метки. Вы не будете хранить их на компьютере таким образом (вы не могли бы сохранить отсканированное изображение). По сути, у вас была бы программа для кодирования данных, выводящая изображение на экран для копирования пользователем. Затем, чтобы перенести его обратно на компьютер, вы должны использовать программу декодирования, которая либо OCR / OMR сканирует отсканированное изображение, либо принимает ввод через клавиатуру (например, `alt` +` a` для курсивного "a"). Lèse majesté 12 лет назад 0
Видите, вот с чем у меня проблема: «у вас была бы программа для кодирования данных» ... нет, нет. У меня нет программы для этого, и я не знаю ни одной программы для этого. Я также не знаю ни о каком формате файла, который может изящно обрабатывать байт * удаленный * (не удаленный) из начала файла поверх других ошибок. Я определенно согласен с тем, что это методы для увеличения плотности данных, но сейчас это не моя главная задача, это простота чтения / записи и защита от ошибок. Jeremy Salwen 12 лет назад 0
@ Джереми: Как я уже сказал, большинство форматов архивов имеют встроенную функцию исправления ошибок, которая, кажется, работает достаточно хорошо для большинства людей. Но если вы хотите что-то специально разработанное для ручной записи, вам нужно написать или попросить кого-нибудь написать что-то для вас. В противном случае вам лучше всего изучить существующие приложения, предназначенные для передачи по каналам с высоким уровнем шума. Хотя самый простой вариант, не заботящийся о плотности данных, - это просто использовать файл RAR с высоким уровнем исправления ошибок, а затем повторить секцию заголовка 3 раза для тройного модульного резервирования. Lèse majesté 12 лет назад 0
Единственные инструменты, которые вам понадобятся, это RAR-программа, например WinRAR, и шестнадцатеричный редактор, например Frhed. Lèse majesté 12 лет назад 0
Нет, я сделал файл с 28K RAR. Добавлены тома восстановления с> 50% томами восстановления. Base64 закодировал его. Удалил шесть символов из содержимого и добавил два. Base64 расшифровал его. rar НЕ МОЖЕТ восстановить файл. Это совершенно неприемлемо для любого вида использования, который я описал. Я не уверен, что такое «достаточно хорошо для большинства людей», но если он не может исправить ошибку в 0,02% с избыточностью> 50%, то для меня это явно недостаточно. Мне все равно, если это что-то специально разработанное для ручной записи, но да, мой вопрос в том, что я могу использовать, что * будет * работать. Jeremy Salwen 12 лет назад 0
1
Retired Spy

We used to use S-Records for this purpose. There was a simple checksum, per line, for error detection. Normally all but the last line was fixed length, so the end-of-line marker served as a check for insertions and deletions. There was no check for missing lines though. For this we simply counted the number of lines. Mostly files were short, less than 100 lines, but I do remember at least one which had 300 lines or more. It was very tedious typing files into the system. Of course, among the first programs transferred this way was a downloader ;)

0
Dour High Arch

Оптическое распознавание меток использовалось десятилетиями для создания машиночитаемых рукописных форм. На странице Википедии есть ссылки на несколько версий с открытым исходным кодом.

Школы давно используют OMR для тестирования; формы просты в использовании и чтении, а точность обычно лучше, чем ввод с клавиатуры. Для более высокой точности коммерческие производители, такие как Scantron и ReMark, могут создавать собственные формы.

Это интересно, к сожалению, для работы требуется сканер или какая-либо другая система обработки изображений, подключенная к компьютеру. Jeremy Salwen 12 лет назад 0

Похожие вопросы