2016-06-23 67 views
2

我试图将二进制数据存储在二维码中。显然,QR码确实支持存储原始二进制数据(或ISO-8859-1/Latin1)。这是我想要的编码(十六进制):以二维码存储二进制数据

d1 50 01 00 00 00 f6 5f 05 2d 8f 0b 40 e2 01 

我已经试过以下编码:

  1. qr.js

qrjs

  • Google Charts
  • charts

  • ​​
  • qrcode.js

    解码与zxing.org生产各种不正确的结果。该两个JavaScript的人产生这样(这是错的;第一个文本字符应该是N

    qr.js and qrcode.js

    而谷歌图表生成此...

    charts what

    发生了什么事是?这些都是正确的吗?真奇怪的是,如果我编码这个序列(至少使用JS),那么它就可以正常工作 - 我原以为这个问题是非ASCII字符,但是Ñ(0xd1)是非ASCII。

    d1 50 01 00 00 00 01 02 03 04 05 06 40 e2 01 
    

    有谁知道发生了什么事?

    更新

    它发生在我尝试使用基于zbar和扫描仪应用程序,我发现扫描它们。它可以扫描两个JS版本(至少它们以ÑP开头)。谷歌图表一个是错误的。所以这似乎是ZXing的问题(这是令人惊讶的狗屎 - 我不会推荐给任何人)。

    更新2

    zbar和不能处理空字节。 :-(

    +0

    各种编码都是可能的,只是解释的问题。我猜你会使用二进制模式('0100'),所以你的输入应该很清楚,但输出会要求你自己编写代码。像Binary2Hex .. – DanFromGermany

    +0

    那么qrcode.js至少声称* only *支持8位模式。我很确定这只是解码器中的错误(ZXing完全被搞砸了,而ZBar使用以null结尾的字符串; yeay C)。 – Timmmm

    回答

    1

    它原来ZXing只是个废话,而ZBar对这些数据做了一些奇怪的事情(例如将其转换为UTF-8)。我设法让它输出包含空字节的原始数据。Here is a patch为最好的Android ZBar库我发现,现在已经合并了。

    0

    就一目了然,使用qr格式是不同的。我比较QR格式,看它是否是纠错编码或者还是其他什么东西的问题。

    enter image description here

    +3

    这应该是一个评论,因为它没有回答这个问题。 – DanFromGermany

    +0

    谢谢@DanFromGermany。 –

    +0

    我很确定1.和3.都是8位模式。 Enc位似乎是错误正确的,所以你不能直接读取它们。 – Timmmm

    0

    我用System.Convert.ToBase64String将提供的样本字节数组转换成Base64编码的字符串,然后我使用ZXing创建一个QRCode图像。

    接下来,我调用ZXing从生成的QRCode读取字符串,然后调用System.Convert.FromBase64String将字符串转换回字节数组。

    我确认数据已成功完成往返。