条形码编码规则有不少,付款码现在用的是Code128编码规则。
Code128编码的特性
具有A、B、C三种不同的编码类型,可提供标准ASCII中128个字元的编码使用
允许双向扫描(正着反着都能扫)
可自行决定是否加上检验位(但付款码必须要校验位)
条码长度可调,但包括开始位和结束位在内,不可超过232个字元(付款码也就十几二十位数字)
同一个128码,可以由A、B、C三种不同编码规则互换,既可扩大字元选择的范围,也可缩短编码的长度(这点十分重要,后面会讲到)
优先选用的编码规则
由于编码规则越复杂,二维码就越复杂,所以条形码编码优先使用的是Code128C这个编码规则。
Code128C将数字两个两个组合在一起,大大减小了条码的复杂度。
code128的编码规则
方便表达,我们用b代表一条黑色像素宽度的线,s代表一条白色像素宽度的线,当bs组合时,中间不留任何缝隙
ABC三种编码的编码表如下,后面会用到这张表:
表格部分内容
(b站没法插入表,完整表格去看https://www.chenxublog.com/2018/09/22/wechat-alipay-barcode-code128.html吧)
对于某种条码的编码规则为:
开始位 + 后面所有的数据按顺序拼接 + 校验位 + 结束位
编码的103-106为起始位于结束位,只会在开头或结尾出现
我们首先使用一个简单的例子来解释如何使用三种编码方式进行条形码的编码:
需要编码成条形码的数据:
1、346
对于Code128A编码:
起始位(StartA:bbsbssssbss)+
数据位(Code128A中的1:bssbbbssbbs)+
数据位(Code128A中的3:bbssbsbbbss)+
数据位(Code128A中的4:bbssbssbbbs)+
数据位(Code128A中的6:bbssbbbsbss)+
校验位((StartA的id + Code128A中的1的id*1 + Code128A中的3的id*2 + Code128A中的4的id*3 + Code128A中的6的id*4) % 103 = (103 + 17*1 + 19*2 + 20*3 + 22*4) % 103 = 自己算去吧:Code128A中对应的id值所表示的编码)
停止位(Stop:bbsssbbbsbsbb)
对于Code128B编码:
B类编码和A几乎完全一样,只有起始位和校验位所使用的开头不一样:
起始位(StartB:bbsbssbssss)+
数据位(Code128B中的1:bssbbbssbbs)+
数据位(Code128B中的3:bbssbsbbbss)+
数据位(Code128B中的4:bbssbssbbbs)+
数据位(Code128B中的6:bbssbbbsbss)+
校验位((StartB的id + Code128B中的1的id*1 + Code128B中的3的id*2 + Code128B中的4的id*3 + Code128B中的6的id*4) % 103 = (104 + 17*1 + 19*2