кодировать / декодировать двоичные данные в qr-коде, используя qrencode и zbarimg в bash - PullRequest
2 голосов
/ 03 марта 2020

У меня есть некоторые двоичные данные, которые я хочу закодировать в qr-коде, а затем иметь возможность декодировать все это в bash. После поиска, похоже, я должен использовать qrencode для кодирования и zbarimg для декодирования. После небольшого устранения неполадок мне все еще не удается расшифровать то, что я кодировал

Есть идеи, почему? В настоящее время я ближе всего к решению:

$ dd if=/dev/urandom bs=10 count=1 status=none > data.bin
$ xxd data.bin
00000000: b255 f625 1cf7 a051 3d07                 .U.%...Q=.
$ cat data.bin | qrencode -l H -8 -o data.png
$ zbarimg --raw --quiet data.png | xxd
00000000: c2b2 55c3 b625 1cc3 b7c2 a051 3d07 0a    ..U..%.....Q=..

Похоже, я не очень далеко, но что-то еще не так.

Редактировать 1 : a возможное исправление заключается в использовании base64-обтекания, как объяснено в ответе @leagris.

Edit 2 : использование кодировки base64 удваивает размер сообщения. Причина, по которой я использую двоичный файл, в первую очередь, заключается в том, чтобы быть эффективным по размеру, поэтому я хотел бы избежать этого. Извините ответ @leagris, поскольку я хотел бы, чтобы он был «полностью двоичным», извините.

Редактировать 3 : по состоянию на 2020-03-03 похоже, что это хорошо известная проблема zbarimg и запрос на ее устранение уже в пути:

https://github.com/mchehab/zbar/pull/64

Edit 4 : если вам известен другой инструмент командной строки на linux, который может дешифровать qr-коды с двоичным содержимым, пожалуйста, дайте мне знать.

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Мой запрос на получение ответа был применен . ZBar версия 0.23.1 и новее смогут декодировать двоичные QR-коды:

zbarimg --raw --oneshot -Sbinary qr.png
zbarcam --raw --oneshot -Sbinary

QR-коды имеют несколько режимов кодирования. Простейшим, наиболее часто используемым и широко поддерживаемым является кодировка alphanumeri c, которая подходит для простого текста. Байтовое кодирование позволяет хранить произвольные 8-битные данные в QR-коде. Режим ECI подобен 8-битному режиму, но с дополнительными метаданными, которые сообщают декодеру, какой набор символов использовать для декодирования двоичных данных обратно в текст. Вот список известных значений ECI и кодировок символов, которые они представляют. Например, когда декодер обнаруживает QR-код в режиме ECI 26, он знает, что декодирует двоичные данные как UTF-8.

Инструмент qrencode выполняет свою работу правильно: создание QR-кода в байтовом режиме с данными, которые вы указали в качестве содержимого. Проблема в том, что большинство декодеров были специально разработаны для обработки текстовых данных в первую очередь. Извлечение необработанных двоичных данных - в лучшем случае подробность.

В текущих версиях библиотеки zbar QR-коды в байтовом режиме будут обрабатываться так, как если бы они были неизвестными QR-кодами в режиме ECI. Если набор символов не указан, он попытается угадать кодировку и преобразовать в нее данные. Это, скорее всего, искажает двоичные данные. Как вы заметили, я поднял этот вопрос в выпуске # 55 и через некоторое время смог отправить запрос на извлечение , чтобы улучшить это. В случае слияния библиотека будет иметь опцию декодера binary, которая будет указывать декодерам возвращать необработанные двоичные данные без их преобразования. Другим источником искажения данных является тенденция инструментов командной строки добавлять строки к выводу. Я отправил запрос на извлечение , чтобы пользователи могли предотвратить это, и он уже объединен.

Библиотека zxing-cpp также попытается угадать кодирование двоичных данных в QR-кодах. В комментариях предполагается, что спецификация QR-кода требует, чтобы декодеры выбирали кодировку без указания значения по умолчанию или не позволяли им возвращать необработанные двоичные данные. Чтобы сделать это возможным, двоичные данные копируются в байтовый массив , к которому можно получить доступ через DecoderResult. Когда у меня есть свободное время, я намереваюсь написать zximg и zxcam инструменты с поддержкой двоичного декодирования для этой библиотеки.

Всегда можно кодировать двоичные данные как базы 64 и закодируйте результат как алфавитный код c QR. Однако кодировка base 64 увеличивает размер данных, а режим alphanumeri c не позволяет использовать максимальную емкость QR-кода. В комментарии вы упомянули, для чего вы собираетесь использовать двоичные QR-коды:

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

Это именно тот случай использования, который я пытаюсь включить с помощью своего запроса на извлечение: более легкий для восстановления paperkey . 4096-битные секретные ключи RSA могут быть непосредственно QR-кодированы в 8-битном режиме, но не в режиме alphanumeri c как данные, закодированные в 64-значном формате.

2 голосов
/ 03 марта 2020

См. Также: Хранение двоичных данных в QR-кодах

Похоже, zbarimg поддерживает только печатные символы и добавляет новую строку

printf '%s' 'Hello World!' >data.bin
xxd data.bin
qrencode -l H -8 -o data.png -r data.bin
zbarimg --raw --quiet data.png | xxd

Я думаю, что Лучше, более портативным вариантом было бы кодировать base64 ваши двоичные данные перед кодированием qr.

Как это:

dd if=/dev/urandom bs=10 count=1 status=none > data.bin
xxd data.bin
base64 <data.bin | qrencode -l H -8 -o data.png
zbarimg --raw --quiet data.png | base64 -d | xxd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...