在 bash 中使用 qrencode 和 zbarimg 编码/解码二维码中的二进制数据
encode / decode binary data in a qr-code using qrencode and zbarimg in bash
我有一些二进制数据,我想用二维码编码然后解码,所有这些都在 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:一种可能的解决方法是使用 base64 包装,如@leagris 的回答中所述。
编辑 2:使用 base64 编码使消息的大小加倍。我首先使用二进制的原因是为了节省大小,所以我想避免这种情况。取消接受@leagris 的回答,因为我希望得到它 'full binary',抱歉。
编辑 3:截至 2020 年 3 月 3 日,这似乎是 zbarimg
的一个众所周知的问题,解决此问题的拉取请求是正在路上:
https://github.com/mchehab/zbar/pull/64
编辑 4:如果您知道 linux 上的另一个命令行工具能够解密二进制内容的二维码,请随时让我知道。
另请参阅:
看起来 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
我认为更好更便携的选择是在 qr 编码之前对二进制数据进行 base64 编码。
像这样:
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
我的 pull request 已经 applied. ZBar version 0.23.1 并且更新的将能够解码二进制 QR 码:
zbarimg --raw --oneshot -Sbinary qr.png
zbarcam --raw --oneshot -Sbinary
二维码有多种编码方式。最简单、最常用和广泛支持的是适用于简单文本的字母数字编码。字节编码允许在 QR 码中存储任意 8 位数据。 ECI mode is like 8 bit mode but with additional metadata that tells the decoder which character set to use in order to decode the binary data back to text. Here's a list 已知 ECI 值及其代表的字符编码。例如,当解码器遇到 ECI 26 模式 QR 码时,它知道将二进制数据解码为 UTF-8。
qrencode
工具正确地完成了它的工作:它正在创建一个字节模式的 QR 码,其中包含您提供的数据作为其内容。问题是大多数解码器被明确设计为首先处理文本数据。原始二进制数据的检索充其量只是一个细节。
当前版本的 zbar
library will treat byte mode QR codes as if they were unknown ECI mode QR codes. If a character set isn't specified, it will attempt to guess the encoding and convert the data to it. This will most likely mangle the binary data. As you noted, I brought this up in issue #55 and after some time managed to submit a pull request to improve this. Should it be merged, the library will have binary
decoder option that will instruct decoders to return the raw binary data without converting it. Another source of data mangling is the tendency of the command line tools to append line feeds to the output. I submitted a pull request 允许用户防止这种情况并且它已经被合并。
zxing-cpp
library will also try to guess the encoding of binary data in QR codes. The comments suggest that the QR code specification requires that decoders pick an encoding without specifying a default or allowing them to return the raw binary data. In order to make that possible, the binary data is copied to a byte array which can be accessed through the DecoderResult
. When I have some free time, I intend to write zximg
and zxcam
tools 此库支持二进制解码。
总是可以将二进制数据编码为 base 64,并将结果编码为字母数字 QR 码。但是,base 64 编码会增加数据的大小,并且字母数字模式不允许使用 QR 码的最大容量。在评论中,您提到了您打算将二进制 QR 码用于:
I want to have a package to effectively dump some gpg stuff in a format that makes recovery easy.
这正是我试图通过我的拉取请求启用的用例:更容易恢复 paperkey。 4096 位 RSA 密钥可以直接以 8 位模式进行 QR 编码,但不能以字母数字模式作为 base 64 编码数据。
我有一些二进制数据,我想用二维码编码然后解码,所有这些都在 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:一种可能的解决方法是使用 base64 包装,如@leagris 的回答中所述。
编辑 2:使用 base64 编码使消息的大小加倍。我首先使用二进制的原因是为了节省大小,所以我想避免这种情况。取消接受@leagris 的回答,因为我希望得到它 'full binary',抱歉。
编辑 3:截至 2020 年 3 月 3 日,这似乎是 zbarimg
的一个众所周知的问题,解决此问题的拉取请求是正在路上:
https://github.com/mchehab/zbar/pull/64
编辑 4:如果您知道 linux 上的另一个命令行工具能够解密二进制内容的二维码,请随时让我知道。
另请参阅:
看起来 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
我认为更好更便携的选择是在 qr 编码之前对二进制数据进行 base64 编码。
像这样:
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
我的 pull request 已经 applied. ZBar version 0.23.1 并且更新的将能够解码二进制 QR 码:
zbarimg --raw --oneshot -Sbinary qr.png
zbarcam --raw --oneshot -Sbinary
二维码有多种编码方式。最简单、最常用和广泛支持的是适用于简单文本的字母数字编码。字节编码允许在 QR 码中存储任意 8 位数据。 ECI mode is like 8 bit mode but with additional metadata that tells the decoder which character set to use in order to decode the binary data back to text. Here's a list 已知 ECI 值及其代表的字符编码。例如,当解码器遇到 ECI 26 模式 QR 码时,它知道将二进制数据解码为 UTF-8。
qrencode
工具正确地完成了它的工作:它正在创建一个字节模式的 QR 码,其中包含您提供的数据作为其内容。问题是大多数解码器被明确设计为首先处理文本数据。原始二进制数据的检索充其量只是一个细节。
当前版本的 zbar
library will treat byte mode QR codes as if they were unknown ECI mode QR codes. If a character set isn't specified, it will attempt to guess the encoding and convert the data to it. This will most likely mangle the binary data. As you noted, I brought this up in issue #55 and after some time managed to submit a pull request to improve this. Should it be merged, the library will have binary
decoder option that will instruct decoders to return the raw binary data without converting it. Another source of data mangling is the tendency of the command line tools to append line feeds to the output. I submitted a pull request 允许用户防止这种情况并且它已经被合并。
zxing-cpp
library will also try to guess the encoding of binary data in QR codes. The comments suggest that the QR code specification requires that decoders pick an encoding without specifying a default or allowing them to return the raw binary data. In order to make that possible, the binary data is copied to a byte array which can be accessed through the DecoderResult
. When I have some free time, I intend to write zximg
and zxcam
tools 此库支持二进制解码。
总是可以将二进制数据编码为 base 64,并将结果编码为字母数字 QR 码。但是,base 64 编码会增加数据的大小,并且字母数字模式不允许使用 QR 码的最大容量。在评论中,您提到了您打算将二进制 QR 码用于:
I want to have a package to effectively dump some gpg stuff in a format that makes recovery easy.
这正是我试图通过我的拉取请求启用的用例:更容易恢复 paperkey。 4096 位 RSA 密钥可以直接以 8 位模式进行 QR 编码,但不能以字母数字模式作为 base 64 编码数据。