标签:
二维码 (QR Code)是一种特殊的条形码,它能够将数字、字母、汉字等信息编码。本文将为希望学习QR编码的程序员提供指导。QR码的编码是一个复杂的过程,尤其是生成纠错码这一步骤。本文尝试尽可能简单明了地介绍整个编码过程。本文将假设读者具备基本的编码能力。
QR码于1994年由日本公司Denso-Wave发明,该公司是Toyota旗下负责生产自动化部件的子公司。QR码的标准目前已被编入ISO/IEC 18004:2006标准中,无需授权使用。
QR码的最小规格为21x21像素,最大规格为177x177像素。在QR码中,这些不同的大小被称为版本(version)。21x21对应为verion 1,25x25为version 2,依此类推。而最大的177x177为version 40。
QR码还具备纠错功能:当我们对信息进行编码时,还需生成一些冗余数据,使得在码的一部分已不可读的情况下,QR扫描器仍然能够准确地进行解码。可选的纠错级别有4级:最低的一级是L级,使用L级纠错的QR码最多允许7%的码损坏;随后是M级,支持15%纠错;随后是Q级,支持25%纠错;最高级别的H级,支持30%纠错。
一个QR码的容量取决于version、纠错级别和被编码的数据的类型。QR码支持四种数据的编码:数字、拉丁字母、二进制、汉字。Denso-Wave的list of QR versions提供了各version的码可容纳的数据量。
后面的部分将详细介绍QR编码过程。如下是编码过程的一个总体概述,在阅读其详细步骤之前,可以先浏览一遍此概述。
QR码所编码的是一段文本字符串,QR码标准为可编码的文本定义了四种模式:数字编码,字符编码,字节编码和日文编码(也可用于汉子)。每种模式都将文本视为二进制串 (一个1和0的序列)。各模式使用不同的方式实现文本和二进制串之间的转换,每一种转换方式都自带优化,能够将数据编码后得到的串缩至最短。因此,第一步应当进行数据分析,以确定数据属于哪一种类型,并选择最佳的模式。
在选择了合适的编码模式之后,下一步就是对数据进行编码。数据编码一节描述了每一种编码模式的过程细节,最终的结果是二进制串被拆分成字 (codewords),每个字长为8bit。
正如上面所述,QR码包含纠错能力,这意味着将数据转化成二进制串之后,还需要为此串生成纠错码,这一过程将使用Reed-Solomon纠错校验方法。
QR扫描器会同时扫描数据码和纠错码,并比较此二者,以判断读取的数据是否正确,如果不正确,还可通过纠错码将错误的数据纠正回来。纠错校验一节解释了纠错码生成过程的细节。更多内容详见Wikipedia上的文章Reed-Solomon error correction。
前面生成的数据码和纠错码,在这一步按照一定的顺序进行排列。对于大型的QR码。码字将被组织成块 (blocks),而这些块须按照QR码的规格交织到一起。结构化一节将详述这一过程。
在生成了数据码和纠错码,并按照正确顺序进行了排列之后,需要将这些bit填充到QR码的矩阵中。这些bit的排布亦有特定的方式。在此过程中,有一些QR码统一的格式,例如三个码眼分别处于矩阵的三个角。矩阵填充一节将详述这一过程。
QR码的某些特征可能导致扫描器难以正确地进行解析。为了解决这一问题,标准中定义了8种掩码,每一种掩码都可将QR码修饰成不同的样子。在生成二维码时,我们需要事先确定哪一种掩码是最合适的。掩码的评估和选择可以基于4条惩罚规则,最终生成的二维码,其罚分必须最小化。掩码一节详述了该过程。
最后一步是向QR矩阵中填充一些格式化数据和版本信息(如果需要),把前面的步骤未处理的一些空白的特定区域填充完整。格式化数据定义了纠错级别和掩码类型。而版本信息定义了二维码的大小规格,只有在一些较大的二维码中才会需要。格式和版本信息一节详述了这一过程。
标签:
原文地址:http://www.cnblogs.com/zhchngzng/p/5106758.html