Кодирование данных на физическом носителе для программистов-пустышек
В Бумаге как цифровом носителе данных я описал преимущества хранения данных на физических носителях, в том числе возможность долговременного хранения, анонимность издателя и конфиденциальность распространения. Вопрос, на который не ответили: как это сделать?
Компьютеры есть компьютеры, и они используют диски и файлы… как вам удастся хранить цифровую информацию на бумаге!?
Эту идею я вынашивал с 2017 года, когда преподавал вводное программирование в местном колледже. Я надеялся, что его можно будет использовать как способ выявления студентов, интересующихся очень конкретными типами вычислений. Это также рассматривалось как способ задействовать интерес учащихся к социальной справедливости и социальным изменениям. Я расклеивал по школе плакаты с приглашением в клуб анализа данных, но закодированные таким образом, чтобы это могли заметить только заинтересованные ученики.
Идея сохранить это в секрете, не вызывая паники у администраторов, не выглядела так, как будто она будет реализована. Вместо этого он стал планом урока, и поэтому было создано демонстративное практическое руководство.
Простая демонстрация, вероятно, самая простая… она, безусловно, самая веселая. Я призываю вас играть вместе.
Как вы храните цифру в виде изображения?
Помните, когда вы были в начальной школе, и ваш учитель разлучил вас с вашим другом, чтобы вы не могли разговаривать друг с другом? Естественно, вы вместе с другом создали секретный код и начали передавать записки.
Мы собираемся создать секретное сообщение, чтобы передать его другу.
Предварительные требования
По желанию, прохождение этого упражнения с другом тоже может быть забавным. Это как передавать секретные сообщения по классу в начальной школе.
Шаг 1. Проверьте файл
Откройте файл примера с помощью шестнадцатеричного редактора. Вы должны увидеть что-то вроде этого…
|50 4B 03 04 14 00 00 08 00 00 25 30 8B 51|PK........%0.Q│
|6F 61 AB 2C 14 00 00 00 14 00 00 00 08 00│oa.,..........│
|00 00 6D 69 6D 65 74 79 70 65 61 70 70 6C│..mimetypeappl│
│69 63 61 74 69 6F 6E 2F 65 70 75 62 2B 7A│ication/epub+z│
│69 70 50 4B 03 04 14 00 00 08 08 00 25 30│ipPK........%0│
│8B 51 00 00 00 00 02 00 00 00 00 00 00 00│.Q............│
│09 00 00 00 4D 45 54 41 2D 49 4E 46 2F 03│....META-INF/.│
│00 50 4B 03 04 14 00 00 08 08 00 25 30 8B│.PK........%0.│
│51 90 9F 06 74 9A 00 00 00 F4 00 00 00 16│Q...t.........|
Большинство людей не утруждают себя проверкой фактического содержимого файлов (СОВЕТ: именно поэтому люди предпочитают передавать данные в виде текста), но вы можете получить много интересной информации, минуя компьютерные программы, предназначенные для их использования.
Например, обладая некоторыми ноу-хау, мы можем сразу сказать две вещи об открытом файле:
- Вероятно, это файл
zip
Мы видим, что первые два байта файла — это значения50и4B(в шестнадцатеричной записи). Интересно, что эти значения соответствуютASCIIсимволамPK. Много лет назад стало принято подписывать начало файлов вашего приложения, чтобы вы могли отличить свои файлы от файлов других форматов.PKозначает PKZip от PKware, оригинальной компании, создавшей формат файла. - Это файл
epub
Во-вторых, я вижу, чтоmimetypeэтоapplication/epub+zip. Итак, это файл ePUB (и подтвержден как zip).
На двоичном уровне содержится много информации.
сериализовать
Цель состоит в том, чтобы преобразовать файл в читаемый формат. Самый простой способ сделать это — конвертировать по одному байту за раз.
Это имеет преимущество делать это по порядку. Порядок имеет значение, поэтому, читая от начала до конца по порядку, мы гарантируем, что человек, которому мы отправляем сообщение, получит его в правильном порядке.
Итак, давайте прочитаем первый байт, это шестнадцатеричное значение 50.
Запишите это на бумаге с сеткой (и, возможно, следующую пару значений, пока мы этим занимаемся).
Преобразовать в двоичный
То, что мы ищем, — это последовательность битов, и каждая шестнадцатеричная цифра представляет 4 бита (полбайта или «полубайт»). Итак, нам нужно преобразовать каждую цифру в ее двоичную форму.
Берем первый:
- 5₁₆
- 5₁₀
- 0111₂
Не бойтесь использовать калькулятор вашего компьютера.
Теперь, поскольку это секретная заметка, нам нужно удалить наши исходные рабочие числа. Возьмите ножницы и отрежьте первую колонку от бумаги.
(Я переключаю свою нотацию на ASCII-графику… для тех, кто хочет поиграть в текстовом редакторе)
______
_0101_
_0000_
_0100_
_1011_
______
______
_0000_
_0011_
_????_
_????_
______
Преобразовать в изображение
Штрих-код — это просто изображение, которое можно интерпретировать как числа. Ключевым моментом для нас является то, что нам не нужно использовать символы 0 и 1, любые два символа, которые легко отличить друг от друга, будут работать нормально.
Это похоже на то, как работает азбука Морзе, в которой двоичная последовательность символов представлена тонами разной длины. Неважно, что используется, главное, чтобы эти две вещи были различимы.
Одним действительно хорошим символом, который будет легко различим компьютером с камерой, будут light и dark. Это удобно, потому что цвет можно легко напечатать на бумаге. Мы можем использовать «отсутствие пигмента» (света) для представления 0, а «наличие пигмента» — для представления 1.
Помните, как я сказал использовать pencil?
- Возьмите ластик и сотрите каждые
0 - Возьми карандаш и раскрась каждый
1
______
_ █ █_
_ _
_ █ _
_█ ██_
______
_ _
_ ██_
_????_
_????_
______
Мои глаза глючат
Это идет хорошо. Теперь у нас есть ряд двоичных цифр, закодированных как цветные полосы. Это также известно как «штрих-код».
Есть еще одна проблема.
Я старею.
Мои глаза уже не те, что раньше.
Мне трудно уследить, где линии начинаются и заканчиваются.
Это особенно проблематично на линиях, в которых вообще ничего нет. У числа ноль (строка номер 2) нет «ничего», чтобы показать, что это ноль. Чтобы помочь нашему другу, которому нужно расшифровать наше секретное сообщение, давайте разработаем несколько рекомендаций. Это поможет им увидеть, где начинаются и заканчиваются очереди, или что очередь вообще есть. Декодеру также нужен какой-то способ узнать, насколько велики квадраты, чтобы помочь различить, где цифры начинаются и заканчиваются.
Вы заметите, что я оставил некоторые заполнители в своих обозначениях, давайте заполним их:
- Раскрась все блоки слева
- Раскрасьте каждый второй блок сверху
█ █ █
█ █ ██
█
█ █ █
██ ██
██████
█ █ █
█ █
█ ██
█????█
█????
██████
Имея эти направляющие, мы можем сказать, где начинаются блоки и насколько велик каждый bit квадрат на бумаге.
Хм... это очень похоже на двухмерный штрих-код.
Домашнее задание
Принимая во внимание таблицу символов ANSI и учитывая, что байты поступают в виде 8-битных наборов, вероятно, немного проще записать блоки в сетках 8x8:

Дополнительно: параллельная доставка
Вы заметите, что с этими рекомендациями мы можем рассматривать каждую сетку 8x8 как отдельный блок для декодирования. Это немного облегчает нам умственную работу, а также предлагает еще один способ облегчить декодирование нашего сообщения получателем:
- На обратной стороне каждого блока напишите его порядковый номер.
- Вырезать каждый блок
Теперь, когда ваш получатель получает все блоки, он может разделить работу с некоторыми помощниками. Каждый человек может закодировать свой маленький блок, а позже блоки можно снова сшить.
Дальнейшее чтение
Пришло время указать, что это упрощенный пример. Это была демонстрация того, что такое возможно.
Когда вы идете от ничего к чему-то, первый шаг — понять, что это возможно. Теперь, когда вы понимаете, что такое возможно, самое время перейти к безумным способам сделать это лучше:
- Чудо Unicode Одной из больших проблем с вышеприведенным решением проблемы штрих-кода является количество потерянных битов. Взгляните на Unicode, если хотите увидеть, сколько информации можно упаковать в один бит.
- Википедия: Datamatrix Как только вы освоитесь с этим, подумайте о DataMatrix и о том, как он упаковывает больше данных в то же пространство. (тогда просто знайте, что существует фактическая спецификация, соответствующая Спецификации GS1 Datamatrix)
- Штрих-коды 1D, 2D и 3D Теперь поразитесь 3D-штрих-кодам. (Для справки, я принципиально отвергаю 4D штрих-коды)
Если вы заинтересованы в практическом применении, и это просто разжигает ваш аппетит, я рекомендую вам проверить Barcode Epub, конвертер штрих-кода в epub, подходящий для анонимной передачи и архивирования всего, от плакатов цифрового маркетинга до публикации данных, используемых в вашей диссертации. .
Может быть, вы даже можете прикрепить его к доске объявлений.
Если вам понравилось, пожалуйста, оставьте комментарий или задайте вопрос, и не забудьте нажать Подписаться, чтобы поощрять будущие статьи.