我相信我可以成功地将二进制数据编码为二维码,但我很难解码该数据。
这个问题的最佳答案表明 QR 码阅读器通常在解码二进制数据时遇到问题:
问题出在解码上。因为大多数解码器会尝试将其解释为文本。但由于它是二进制数据,因此您不应尝试将其作为文本处理。即使您认为可以将其从文本转换为二进制,正如您所看到的,这可能会导致值不是有效文本的问题。
对于 Python 包来说,这有多真实?我尝试过使用pyzbarand opencv,但没有成功(它们对于utf-8字符串工作得很好)。我也在努力寻找 pyzbar 的有用文档,而 opencv 的文档却没有什么成果。
为了完整起见,下面是我创建的一个 QR 码示例。
data = b'\x00\x00\x00\x00\x00\x00\x00\x00\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00\x84\x00\x03\x02\x02\n\n\n\n\n\n\n\n\n\n\n\n\x08\x08\n\n\n\n\x08\x08\n\x08\x08\x08\x08\x08\x08\x08\x08\x08\n\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\n\x08\x08\x08\x08\n\n\n\x08\x08\r\r\n\x08\r\x08\x08\n\x08\x01\x03\x04\x04\x06\x05\x06\n\x06\x06\n\x0f\x0e\x0b\r\x0f\x0f\x0f\x0f\x10\x10\x0f\x0f\x0f\x0f\x0f\x0f\x0f\r\r\r\x0f\r\x0f\x0f\x0f\r\r\r\r\x0f\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xff\xc0\x00\x11\x08\x01@\x02\x00\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1d\x00\x00\x02\x03\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\x05\x02\x03\x06\x01\x07\x00\x08\t\xff\xc4\x00C\x10\x00\x02\x01\x02\x04\x04\x03\x05\x06\x06\x01\x03\x03\x03\x05\x00\x01\x02\x11\x00\x03\x04\x12!1\x05\x06"AQaq\x07\x132\x81\xf0\x14\x91\xa1\xb1\xc1\xd1\x08\x15#B'
Run Code Online (Sandbox Code Playgroud)
为了从该字节字符串生成二维码,我使用该segmo库,如下所示:
qr = segno.make(data)
qr.save(path/to/output/file)
Run Code Online (Sandbox Code Playgroud)
这是生成的二维码:
我的 Java 程序需要通过 QR 码发送二进制有效负载,但我无法让它工作。我尝试了几个QR码库和许多方法,但似乎都有这个问题。我当前的实现使用ZXING。
问题是我尝试过的所有 Java 库似乎都专注于 String 有效负载,并且不提供对二进制数据的支持。通常建议的解决方案是将二进制数据编码为 Base64。然而,我的数据已经接近二维码的大小限制。由于Base64编码导致33%的通货膨胀,我的数据太大了。我已经付出了巨大的努力来减少有效负载的大小,它目前由 4 个字符散列组成,并由新行分隔;所有这些都在 Java Deflator 类的最大级别压缩中。我无法让它变得更小。
我需要一种以最小的数据膨胀开销将二进制数据存储在二维码中的方法。
我有一些二进制数据,我想用二维码编码,然后能够解码,所有这些都在 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=..
Run Code Online (Sandbox Code Playgroud)
看起来我不是很远,但仍然有一些东西。
编辑 1:一个可能的解决方法是使用 base64 包装,如@leagris 的回答中所述。
编辑 2:使用 base64 编码使消息的大小加倍。我首先使用二进制文件的原因是为了节省大小,所以我想避免这种情况。不接受@leagris 的答案,因为我希望它是“完整的二进制文件”,抱歉。
编辑 3:截至 2020 年3 月 3 日,这似乎是一个众所周知的问题,zbarimg解决此问题的拉取请求正在进行中:
https://github.com/mchehab/zbar/pull/64
编辑 …