精华内容
下载资源
问答
  • 文章目录引言I 、支付知识储备1.1非记账1.2流程1.3支付状态1.4 结算周期的概念:`D0、T1`1.5 常用的几个支付产品的付款码二维码编码规则:Code128编码, 应用场景为`聚合支付`1.6 脱敏规范1.7 银行卡号有效性校验II、...

    引言

    • 支付流程:POS终端刷卡流程

    (多支付方式组合支付、单支付方式:聚合支付、微信、支付宝、银联、记账等)

    • 支付知识储备

    支付状态、结算周期

    I、支付流程

    II 、支付知识储备

    1.0 退款状态(转入代发)

    • SUCCESS—退款成功
    • FAIL—退款失败
    • PROCESSING—退款处理中
    • NOTSURE—未确定, 需要商户原退款单号重新发起
    • CHANGE—转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者平台转账的方式进行退款。

    1.1支付状态

        /**
         * 支付状态
         */
        public static final int PAY_STATE_IN_PAYMENT = 1;//支付中
        public static final int PAY_STATE_PAYMENT_FAILURE = 2;//支付失败
        public static final int PAY_STATE_SUCCESS = 3;//成功
        public static final int PAY_STATE_OVERTIME = 4;//支付超时
        public static final int PAY_STATE_CANCEL = 5;//支付取消
        public static final int PAY_STATE_WASH = 6;//已冲正
    
    

    1.1.1 冲正

    POS终端刷卡流程: POS终端刷卡—收单机构—数据到银联中心—发卡行—返回银联中心—收单机构—返回POS终端出票

    如果中间任何一个环节发生通讯数据错误,交易不成功,POS终端都不会出票。
    而未打印签购单,持卡人却收到扣款信息是因为数据已经到了发卡行,发卡行记录了此笔消费,但数据未反馈到POS终端上。
    因此,没有打印签购单,交易实际为不成功,同时POS终端将在下笔联机交易自动进行冲正,所扣交易金额一般自动退回到原交易银行卡。

    • 冲正: 当POS机发起交易后,消费者这端被扣成功,但POS机没有在规定时间内接收到交易应答,终端就会发起冲正。

    冲正(chōng zhèng)是为系统认为可能交易失败时采取的补救手法。即一笔交易在终端已经置为成功标志,但是发送到主机的账务交易包没有得到响应,即终端交易超时,所以不确定该笔交易是否在主机端也成功完成,为了确保用户的利益,终端重新向主机发送请求,请求取消该笔交易的流水,如果主机端已经交易成功,则回滚交易,否则不处理,然后将处理结果返回给终端。

    注:交易冲正的数据不打印签购单

    1.2 结算周期的概念:

    • 结算周期类型
    
    "keyName": "ESettlementCycle",
            "data": [{
                "text": "D0",
                "value": 0
            }, {
                "text": "T1",
                "value": 1
            }, {
                "text": "D1",
                "value": 3
            }, {
                "text": "R0",
                "value": 4
            }, {
                "text": "R1",
                "value": 5
            }],
            "description": "结算周期"
    
    

    1.2.1 D0、T1

    • D0:自然日当天(当日结算)

    • D1:自然日第二天

    • T0:工作日当天

    • T1:工作日第二天(下个工作日)

    t1是下一个工作日结算,d1是第二天

    1.2.2 特殊/自定义结算周期 R0

    在这里插入图片描述

    R0手续费:r0ServiceRate
    R0结算周期 :SettlementDate   
    

    1.3 什么是【非记账】?

    • 聚合支付(微信、支付宝、银联):从用户的角度可以分为主动扫商家的收款码和 提供付款码给商家扫一扫

    • 涉及的技术点: 支付状态的查询采用 递归方式的轮询以及消息推送

    1.4 常用的几个支付产品的付款码二维码编码规则:Code128编码, 应用场景为聚合支付

    在这里插入图片描述

    可以用于聚合支付的场景:根据扫出来的码,进行智能判断用户选择的支付方式,到不同的支付公司扣款,提升用户体验,避免提前询问用户支付方式
    就是商家用扫码枪扫你的二维码,商家不需要提前知道你是用支付宝或者微信,直接扫你的码,根据扫出来的码到不通的支付公司扣款。

    1.5 脱敏规范

    • 应用场景:商户结算账户信息加密保存,脱敏显示
    • PBKDF2算法
      通过多次hash来对密码进行加密。原理是通过password和salt进行hash,然后将结果作为salt在与password进行hash,多次重复此过程,生成最终的密文。此过程可能达到上千次,逆向破解的难度太大,破解一个密码的时间可能需要几百年,所以PBKDF2算法是安全的.
      使用PBKDF2算法时,HASH算法一般选用sha1或者sha256,随机盐的长度一般不能少于8字节,HASH次数至少也要1000次,这样安全性才足够高。一次密码验证过程进行1000次HASH运算,对服务器来说可能只需要1ms,但对于破解者来说计算成本增加了1000倍,而至少8字节随机盐,更是把建表难度提升了N个数量级,使得大批量的破解密码几乎不可行,该算法也是美国国家标准与技术研究院推荐使用的算法。

    在这里插入图片描述

    1.6 银行卡号有效性校验

    1.7 第三方流水号

    1、账单流水>>支付详情,商户流水号之下 增加“第三方流水号”字段,显示内容为微信或支付宝侧订单号
    2、回调字段为Crm侧显示的第三方流水号tradeno3

    II、测试辅助工具

    2.1 银联辅助工具:被扫消费-付款方仿真

    在这里插入图片描述

    III、扫码验证密码规则

    3.1 微信&支付宝扫码要求验证密码规则

    在这里插入图片描述

    see also

    反洗钱知识

    1、反洗钱重点关注字段:注册商户的注册资金及公司类型
    2、国务院反洗钱行政主管部门是人民银行
    3、人行净网行动警示:域账户密码因长期不更改存在重大安全风险,在登陆电脑、OA系统、云桌面、文档加解密系统等各类使用场景中威胁后台系统安全,应立即整改;

    5月15日打击和防范经济犯罪宣传日

    在这里插入图片描述

    支付安全锦囊

    • 培养良好支付习惯。

    关注账户安全,及时更新手机号等账户信息,确保真实准确,建议开通账户资金变动提醒;关注网络安全,网购支付时建议不连接公共WIFI,通过运营商网络完成付款;
    关注系统安全,在官方市场中下载APP,安装防病毒软件;关注终端安全,设置手机开机密码或指纹验证措施,防止手机失窃后被盗用。

    • 妥善做好个人账户管理。

    若APP不再使用,应在卸载前解除银行卡与APP的绑定关系;合理设置网购账户额度,建议购买账户安全险,降低资金被盗风险;
    不出租、出借、出售个人身份证、银行卡和收款码,防范泄露个人信息,避免成为非法资金转移犯罪活动的帮凶。

    • 自觉抵制非法平台活动。

    坚决抵制跨境赌博活动,不法分子幕后操控赌博输赢,“十赌十输”;不参与“跑分”、“虚拟货币”交易等非法活动,非法交易活动套路多,资金轨迹可溯源,参与非法资金转移活动将承担刑事责任。

    展开全文
  • QRCode 二维码编码解码标准附录.pdf
  • QR二维码编码C版本

    2015-02-04 14:48:35
    linux下的QR二维码编码,不是解码,支持API调用,在PC上也支持命令行
  • 二维码编码解码器源码 本源码实现可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码;二维码也开始应用到很多场合,如火车票有二维码识别、网易的首页有二维码...
  • 二维码编码解码器源码 本源码实现可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码;二维码也开始应用到很多场合,如火车票有二维码识别、网易的首页有二维码...
  • QR二维码编码原理

    千次阅读 2019-01-17 10:44:52
    QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下: 这个图如果被正确解码,应该看到我的名字和邮箱。 ...

    QR码生成原理(一)

    一、什么是QR码

    QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下:

    这个图如果被正确解码,应该看到我的名字和邮箱。

    二、QR码的特点

    说到QR码的特点,一是高速读取(QR就是取自“Quick Response”的首字母),对读取速度的体验源自于我手机上的一个软件,象上面贴出的码图,通过摄像头从拍摄到解码到显示内容也就三秒左右,对摄像的角度也没有什么要求;

    二是高容量、高密度;理论上内容经过压缩处理后可以存7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;

    三是支持纠错处理;纠错处理相对复杂,目前我还没有深入了解,按照QR码的标准文档说明,QR码的纠错分为4个级别,分别是:

    • level L : 最大 7% 的错误能够被纠正;
    • level M : 最大 15% 的错误能够被纠正;
    • level Q : 最大 25% 的错误能够被纠正;
    • level H : 最大 30% 的错误能够被纠正;

    四是结构化;看似无规则的图形,其实对区域有严格的定义,下图就是一个模式2、版本1的QR图结构(关于QR码的"模式"、"版本"将在后面进行介绍):

    在上图21*21的矩阵中,黑白的区域在QR码规范中被指定为固定的位置,称为寻像图形(finder pattern) 和 定位图形(timing pattern)。寻像图形和定位图形用来帮助解码程序确定图形中具体符号的坐标。

    黄色的区域用来保存被编码的数据内容以及纠错信息码。

    蓝色的区域,用来标识纠错的级别(也就是Level L到Level H)和所谓的"Mask pattern",这个区域被称为“格式化信息”(format information)。

    五是扩展能力。QR码的Structure Append特点,使一个QR码可以分解成多个QR码,反之,也可以将多个QR码的数据组合到一个QR码中来。

     

    三、QR码的模式和版本

    前面提到过QR码的模式(Model)和版本(Version)。QR码分为Model1和Model2两种模式,Model1是对QR的初始定义,Model2是对Model1的扩展,目前使用较为普遍的是Model2,本文的所有说明也仅用于Model2。

    QR图的大小(size)被定义为版本(Version),版本号从1到40。版本1就是一个21*21的矩阵,每增加一个版本号,矩阵的大小就增加4个模块(Module),因此,版本40就是一个177*177的矩阵。(版本越高,意味着存储的内容越多,纠错能力也越强)。

    三、QR码支持的编码内容

    QR码支持编码的内容包括纯数字、数字和字符混合编码、8位字节码和包含汉字在内的多字节字符。其中:

    数字:每三个为一组压缩成10bit。

    字母数字混合:每两个为一组,压缩成11bit。                                  

    8bit字节数据:无压缩直接保存。

    多字节字符:每一个字符被压缩成13bit。

    QR码编码原理(二)

    编码就是把常见的数字、字符等转换成QR码的方法。说具体的编码之前,先说一下QR码的最大容量问题。

    一、最大容量

    QR码的最大容量取决于选择的版本、纠错级别和编码模式(Mode:数字、字符、多字节字符等)。以版本1、纠错级别为Level Q的QR码为例,可以存储27个纯数字,或17个字母数字混合字符或11个8bit字节数据。如果要存储同样多的内容同时提高纠错级别,则需要采用更高的版本。版本1~9 数据容量、纠错码容量对照如下表:

    (version) (error correcting level) (count of data code words) count of EC code words (numeric) (alphanumeric) 8bit
    1 L 19 7 41 25 17
    M 16 10 34 20 14
    Q 13 13 27 16 11
    H 9 17 17 10 7
    2 L 34 10 77 47 32
    M 28 16 63 38 26
    Q 22 22 48 29 20
    H 16 28 34 20 14
    3 L 55 15 127 77 53
    M 44 26 101 61 42
    Q 34 36 77 47 32
    H 26 44 58 35 24
    4 L 80 20 187 114 78
    M 64 36 149 90 62
    Q 48 52 111 67 46
    H 36 64 82 50 34
    5 L 108 26 255 154 106
    M 86 48 202 122 84
    Q 62 72 144 87 60
    H 46 88 106 64 44
    6 L 136 36 322 195 134
    M 108 64 255 154 106
    Q 76 96 175 108 74
    H 60 112 139 84 58
    7 L 156 40 370 224 154
    M 124 72 293 178 122
    Q 88 108 207 125 86
    H 66 130 154 93 64
    8 L 194 48 461 279 192
    M 154 88 365 221 152
    Q 110 132 259 157 108
    H 86 156 202 122 84
    9 L 232 60 552 335 230
    M 182 110 432 262 180
    Q 132 160 312 189 130
    H 100 192 235 143 98

    如果要了解更详细的QR码容量信息,可以到电装的网站去看看http://www.denso-wave.com/qrcode/vertable1-e.html

     

    下面,就举例说明将“ABCDE123”转换成为版本1、Level H的QR码转换方法。

    二、模式标识符(Mode Indicator)

    QR码的模式(Mode)就是前文提到的数字、字符、8bit 字节码、多字节码等。对于不同的模式,都有对应的模式标识符(Mode Indicator)来帮助解码程序进行匹配,模式标识符是4bit的二进制数:

    1、数字模式(numeric mode ): 0001
    2、混合字符模式(alphanumeric mode) : 0010
    3、8bit byte mode: 0100
    4、日本汉字(KANJI mode) : 1000

    5、中国汉字(GB2312):1101

    由于示例文本串是混合字符,因此将选择alphanumeric mode,其标识码为:0010

    三、文本串计数标识符(Character count indicator)

    文本串计数标识符用来存储源内容字符串的长度,在版本1-9的QR码中,文本串长度标识符自身的长度被定义为:
    数字 : 10bit 
    混合字符 : 9bit
    8bit 字节码 : 8bit
    多字节码 : 8bit

    在本例中,源文本串的长度为8个字符,混合字符的长度为9bit,因此将字符个数8编码为9位二进制表示:000001000

    加上混合字符模式标识码,总的编码为0010 000001000

    四、数据内容编码

     1、数字模式下的编码

    在数字模式下,数据被限制为3个数字一段,分成若干段。如:"123456" 将分成"123" 和 "456",分别被编码成10bit的二进制数。“123”的10bit二进制表示法为:0001111011,实际上就是二进制的123。

    当数据的长度不足3个数字时,如果只有1个数字则用4bit,如果有2个数字就用7个bit来表示。
    如:"9876"被分成"987"和"6"两段,因此被表示为"1111011011 0110"。

    2、混合字符模式下的编码

    混合字符模式编码,其字符对照表如下:

     0     A   10     K   20     U   30     +   40 
    1 1   B 11   L 21   V 31   - 41
    2 2   C 12   M 22   W 32   . 42
    3 3   D 13   N 23   X 33   / 43
    4 4   E 14   O 24   Y 34   : 44
    5 5   F 15   P 25   Z 35
    6 6   G 16   Q 26   [sp] 36
    7 7   H 17   R 27   $ 37
    8 8   I 18   S 28   % 38
    9 9   J 19   T 29   * 3

     

    编码方式为:

    源码被分成两个字符一段,如下所示,每段的第一个字符乘上45,再用第二个数字相加。因此每段变成了11bit的2进制码,如果字符个数只有1个,则用6bit表示。

     

    示例: 

        "AB" "CD" "E1" "23"
        45*10+11 45*12+13 45*14+1 45*2+3
        461 553 631 93
    0010 000001000 00111001101 01000101001 01001110111 00001011101


    3、8bit字节数据不经编码转换直接保存。

    五、编码终止符(Terminator)

    如果编码后的字符长度不足当前版本和纠错级别所存储的容量,则在后续补"0000",如果容量已满则无需添加终止符。此时得到的编码串为:

    0010 000001000 00111001101 01000101001 01001110111 000010111010000
    六、编成8bit码字(Code words)

    将以上的编码再按8bit一组,形成码字(code words):

     00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000
    如果尾部数据不足8bit,则在尾部充0:

    00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000000
    如果编码后的数据不足版本及纠错级别的最大容量,则在尾部补充 "11101100" 和 "00010001",直到全部填满。最后,版本1、Level H下的"ABCDE123" 的QR码是:

    00100000 01000001 11001101 01000101 00101001 11011100 00101110 1000000011101100

    十进制表示法为:

    32 65 205 69 41 220 46 128 236

    QR码编码原理三(日本汉字和中文编码)

    一、日本汉字(KANJI)是两个字节表示的字符码,编码的方式是将其转换为13字节的二进制码制。

    转换步骤为:

    1、对于JIS值为8140(hex) 到9FFC(hex)之间字符:

    a)将待转换的JIS值减去8140(hex);

    b)将高位字节乘以C0(hex);

    c)将b)步骤生成的数据加上低位字节;

    d)将结果转换为13位二进制串。

    2、对于JIS值为E040(hex)到EBBF(hex)之间的字符:

    a)将待转换的JIS值减去C140(hex);

    b)将高位字节乘以C0(hex);

    c)将b)步骤生成的数据加上低位字节;

    d)将结果转换为13位二进制串。

     

    二、中文汉字的与日文汉字转换步骤相似:

    1、对于第一字节为0xA1~0xAA之间,第二字节在0xA1~0xFE之间字符:

    a)第一字节减去0xA1;

    b)上一步结果乘以0x60;

    c)第二字节减去0xA1;

    d)将b)步骤的结果加上c步骤的结果;

    e)将结果转换为13位二进制串。

    1、对于第一字节为0xB0~0xFA之间,第二字节在0xA1~0xFE之间字符:

    a)第一字节减去0xA6;

    b)上一步结果乘以0x60;

    c)第二字节减去0xA1;

    d)将b)步骤的结果加上c步骤的结果;

    e)将结果转换为13位二进制串。

     

    一、使用jquery-qrcode生成二维码

    先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcode 获取),

    qrcode.js 是实现二维码数据计算的核心类,

    jquery.qrcode.js 是把它用jquery方式封装起来的,用它来实现图形渲染,其实就是画图(支持canvas和table两种方式)

     

    支持的功能主要有:

     

    Js代码  

    text     : "https://github.com/jeromeetienne/jquery-qrcode"  //设置二维码内容  

    Js代码 

    render   : "canvas",//设置渲染方式  
    width       : 256,     //设置宽度  
    height      : 256,     //设置高度  
    typeNumber  : -1,      //计算模式  
    correctLevel    : QRErrorCorrectLevel.H,//纠错等级  
    background      : "#ffffff",//背景颜色  
    foreground      : "#000000" //前景颜色  

     

    使用方式非常简单

     

    Js代码  

    jQuery('#output').qrcode({width:200,height:200,correctLevel:0,text:content});  

     

     经过简单实践,

     

    使用canvas方式渲染性能还是非常不错的,但是如果用table方式,性能不太理想,特别是IE9以下的浏览器,所以需要自行优化一下渲染table的方式,这里就不细述了。

     

    二、JS生成中文二维码

    其实上面的js有一个小小的缺点,就是默认不支持中文。

    这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt() 这个方式进行编码转换的,

    而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,

    英文是没有问题,如果是中文,一般情况下Unicode是UTF-16实现,长度2位,而UTF-8编码是3位,这样二维码的编解码就不匹配了。

    解决方式当然是,在二维码编码前把字符串转换成UTF-8,具体代码如下:

     

    Js代码  

    function utf16to8(str) {  
        var out, i, len, c;  
        out = "";  
        len = str.length;  
        for(i = 0; i < len; i++) {  
        c = str.charCodeAt(i);  
        if ((c >= 0x0001) && (c <= 0x007F)) {  
            out += str.charAt(i);  
        } else if (c > 0x07FF) {  
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));  
            out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));  
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));  
        } else {  
            out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));  
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));  
        }  
        }  
        return out;  
    } 

     

    三、参考

     

    https://github.com/jeromeetienne/jquery-qrcode

    http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt

    二维码生成原理

    转自骆定华的博客:http://blog.csdn.net/jason_ldh/article/details/11801355

    展开全文
  • 二维码 编码原理简介

    千次阅读 2011-06-22 11:13:50
    一、什么是二维码二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上) 分布的黑白相间的图形记录数据符号信息的。 在许多种类的二维条码中,常用的码制有:Data Matrix...

    一、什么是二维码:
    二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)
    分布的黑白相间的图形记录数据符号信息的。

    在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。
      1.堆叠式/行排式二维条码,如,Code 16K、Code 49、PDF417(如下图)等


     
        2.矩阵式二维码,最流行莫过于QR CODE
    二维码的名称是相对与一维码来说的,比如以前的条形码就是一个“一维码”,
    它的优点有:二维码存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性(在部分损坏以后可以正常读取);空间利用率高等。

    二、QR CODE 介绍
    QR(Quick-Response) code是被广泛使用的一种二维码,解码速度快。
    它可以存储多用类型




     
    如上图时一个qrcode的基本结构,其中:
    位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;
    校正图形:规格确定,校正图形的数量和位置也就确定了;
    格式信息:表示改二维码的纠错级别,分为L、M、Q、H;

    版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。
    数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

    简要的编码过程:
        1. 数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。

        2. 数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。
              
     

     
     
                数据可以按照一种模式进行编码,以便进行更高效的解码,例如:对数据:01234567编码(版本1-H),
                1)分组:012 345 67
                 2)转成二进制:012→0000001100
                                                       345→0101011001
                                                        67 →1000011
                  3)转成序列:0000001100 0101011001 1000011
                  4)字符数 转成二进制:8→0000001000
                  5)加入模式指示符(上图数字)0001:0001 0000001000 0000001100 0101011001 1000011
               对于字母、中文、日文等只是分组的方式、模式等内容有所区别。基本方法是一致的

        3. 纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。
                 

     
            在二维码规格和纠错等级确定的情况下,其实它所能容纳的码字总数和纠错码字数也就确定了,比如:版本10,纠错等级时H时,总共能容纳346个码字,其中224个纠错码字。
            就是说二维码区域中大约1/3的码字时冗余的。对于这224个纠错码字,它能够纠正112个替代错误(如黑白颠倒)或者224个据读错误(无法读到或者无法译码),
            这样纠错容量为:112/346=32.4%
          
        4. 构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中
            按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块 按顺序构成一个序列,添加到原先的数据码字序列后面。
            如:D1, D12, D23, D35, D2, D13, D24, D36, ... D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,...

    构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。
             

     
           
             把上面的完整序列填充到相应规格的二维码矩阵的区域中


        6. 掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布。
                 一个算法,不研究了,有兴趣的同学可以继续。
        7. 格式和版本信息:生成格式和版本信息放入相应区域内。
            版本7-40都包含了版本信息,没有版本信息的全为0。二维码上两个位置包含了版本信息,它们是冗余的。
            版本信息共18位,6X3的矩阵,其中6位时数据为,如版本号8,数据位的信息时 001000,后面的12位是纠错位。


    至此,二维码的编码流程基本完成了,下面就来实践一下吧,当然不用自己再去编写上面的算法了,使用三方包zxing 就可以了
    编码:
                 public static void encode(String content, String format, String filePath) {
    try {
    Hashtable hints = new Hashtable();//设置编码类型
    hints.put(EncodeHintType.CHARACTER_SET, DEFAULT_ENCODING);
    //编码
                               BitMatrix bitMatrix = new QRCodeWriter().encode(content,
    BarcodeFormat.QR_CODE, DEFAULT_IMAGE_WIDTH,
    DEFAULT_IMAGE_HEIGHT,hints);
    //输出到文件,也可以输出到流
    File file = new File(filePath);
    MatrixToImageWriter.writeToFile(bitMatrix, format, file);

    } catch (IOException e) {
    e.printStackTrace();
    } catch (WriterException e1) {
    e1.printStackTrace();
    }
    }

    解码:    BufferedImage image = ImageIO.read(file);//读取文件
    LuminanceSource source = new BufferedImageLuminanceSource(image);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
    source));
                      //解码
    Result result = new MultiFormatReader().decode(bitmap);
    String resultStr = result.getText();
                    System.out.println(resultStr);



    Done!轮到你了!

    参考内容及资料:
    http://zh.wikipedia.org/wiki/QR%E7%A2%BC
    http://code.google.com/p/zxing/
    http://www.google.com/

    qrcoe编码码标准

    展开全文
  • 经本人测试可用的二维码编码源码,可以简单实现文字输入转换,经测试,可在moto的android系统上进行译码,如果需要增加功能,可以在外围设计一些代码,以供开发使用
  • Data Matrix二维码由美国国际资料公司(International Data Matrix)于1989年发明,是一种由黑色、白色的色块以正方形或长方形组成的二维码,其发展构想是希望在较小的标签上存储更多的信息量。DM码适合于小零件的的...

    概述

    Data Matrix二维码由美国国际资料公司(International Data Matrix)于1989年发明,是一种由黑色、白色的色块以正方形或长方形组成的二维码,其发展构想是希望在较小的标签上存储更多的信息量。DM码的最小尺寸是目前所有条码中最小的,特别适合于小零件的的标识,直接印刷在实体上,被广泛应用在电路、药品等小件物品以及制造业的流水线生产过程。
    在这里插入图片描述
    旧版的 Data Matrix 码包括 ECC000、ECC050、ECC080、ECC100 和 ECC140,而ECC200 是最新的 Data Matrix码版本,两者最大差别在于模块数目。旧版本的模块为奇数,而新版本的模块为偶数。相比而言,ECC200容错能力较强,更为常见,以下所说的Data Matrix二维码特指ECC200。
    在这里插入图片描述

    Data Matrix 码结构

    Data Matrix码由数据区、寻边区(finder pattern)和空白区(quiet zone)组成。数据区包含着编码信息,包括数字、字母和汉字等按照一定的编码规则生成。每个相同大小的黑色和白色方格称为一个数据单元,分别代表二进制的1和0。寻边区包括L型的实心定位标识和反L型的虚线时钟标识。L型实心定位标识主要用于限定DM码的物理尺寸、定位和符号失真。反L型虚线边界主要用于限定单元结构,但也能帮助确定物理尺寸及失真。条码读取器通过对定位标识与时钟标识进行图像处理来检测位置,可进行 360° 全方位读取。寻边区外层为空白区,宽度至少为1个数据单元。
    在这里插入图片描述DM码总共有24种尺寸规格,最小尺寸为10×10模块,最大尺寸为144×144模块。当模块数目超过26×26时将进行分区块,每个区块不会超过26个模块。此结构可防止失真。

    符号尺寸 区块 数据单元
    10×10 至 26×26 1 8×8 至 24×24
    28×28 至 52×52 4 14×14 至 24×24
    64×64 至 104×104 16 14×14 至 24×24
    120×120 至 144×144 36 18×18 至 22×22

    Data Matrix 码的实际尺寸的计算方法为符号尺寸乘以模块的可印刷尺寸。
    例如单元尺寸为 0.25 mm,
    符号尺寸:10 × 10 模块 = 2.5 × 2.5 mm
    符号尺寸:32 × 32 模块 = 8.0 × 8.0 mm
    符号尺寸:8 × 18 模块 = 2.0 × 4.5 mm

    编码规则

    DM码数据区由相同大小的黑白格子组成,分别代表二进制的1和0,以二维元码(binary code)方式进行编码,计算机可直接读取其数据信息。最常见的编码模式采用ASCII方式,每个编码单元有8位,代表一个字节。8个方格组成L型方格阵。

    如下图DM码编码的信息为“Wikipedia”,从数据区左上角第5行第1列开始编码,位于中间区域的编码单元都为标准L型,但位于边缘区域的编码单元被分为多个部分,比如首字母W,部分在左边缘,剩余的部分位于对应右边缘。两部分合起来组成标准L型编码单元。
    在这里插入图片描述另外,在角落中的编码单元可能组成不同的形状(非L型)
    在这里插入图片描述
    除了上述ASCII编码方式,DM编码还提供了Text、C40、X12、EDIFACT和Base256模式。

    编码模式 字符集 每字符数据位数
    ASCII 数字成对编码 4
    ASCII 0-127 8
    扩展ASCII 128-255 16
    C40 主要为大写字母和数字 5.33
    Text 主要为小写字母和数字 5.33
    X12 ANSI X12 EDI 数据集 5.33
    EDIFACT ASCII 32-94 6
    Base 256 0-255 范围的任何数据 8

    不同编码模式可以通过编码值大小进行切换,默认编码模式为ASCII(非扩展),编码值在1~128内,当编码值大于128时,将切换到其他编码模式,比如编码值为230代表后续编码切换到C40编码模式。

    Codeword Interpretation Codeword Interpretation
    0 Not used 1–128 ASCII data (ASCII value + 1)
    129 End of message 130–229 Digit pairs 00 – 99
    230 Begin C40 encoding 231 Begin Base 256 encoding
    232 FNC1(GS1标准规格) 233 Structured append. Allows a message to be split across multiple symbols.
    234 Reader programming 235 Upper Shift - Set high bit of the following character
    236 05 Macro 237 06 Macro
    238 Begin ANSI X12 encoding 239 Begin Text encoding
    240 Begin EDIFACT encoding 241 Extended Channel Interpretation code
    242–255 Not used

    C40、Text和X12编码模式存储文字信息更为节约,将字符编码范围约束在0~39,三个字符组合有403=64000种,通过两个字节便可完成编码(2562= 65536)
    V=C1×1600+C2×40+C3+1V = C1×1600 + C2×40 + C3 + 1
    B1=floor(V/256)B1 = floor(V/256)
    B2=Vmod256B2 = V mod 256
    其中,C1,C2和C3为编码前的字符,B1和B2编码后的字节表示。单个字符编码占据2*8/3=5.33位,B1字节的结果值范围为0~249。当该值设置为254时,编码模式换回ASCII方式。详细编码方式参考【Wiki】Data Matrix

    纠错能力

    Data Matrix码在一部分损坏时也能够自动纠错而不会丢失数据。如下图,即使二维码出现脏污或部分缺失,仍能正确识别。因而DM码很适合应用在条码容易受损的场景,比如印在暴露在高热、化学清洁剂、机械剥蚀等特殊环境的零件上。
    在这里插入图片描述DM码的纠错复原能力源于数据冗余技术,通过对数据增加冗余部分来保证当数据丢失时能够一定程度上进行恢复。如下图所示,DM码绿色方格代表原始数据,红色代表冗余数据。
    在这里插入图片描述通常的冗余备份机制有两类:一类是完全的数据备份机制,即镜像方法,另一类为纠删码(erasure code)的方法。镜像方法又称为多副本技术,就是把数据复制成多个副本分别存储起来,以实现冗余备份,这种备份方法不涉及专门的编码和重构算法,容错性能好,但存储利用率低,当存放N个副本时,磁盘利用率仅为1/N。纠删码技术主要通过利用纠删算法将原始数据进行编码得到冗余,并将数据和冗余一并存储起来,以达容错的目的。
    DM码采用Reed-Solomon编码(里德-所罗门编码)纠错技术,其基本思想给定n个原始数据块(D1,D2,D3,…,Dn),RS编码根据这n个数据块计算生成m个冗余元素(校验块C1,C2,…,Cm)。从这m+n个数据块中任取n个数据块均能解码出原始数据块,即对于n个数据进行RS编码后生成n+m个数据,能够容忍丢失至多m个数据。
    实现的功能听上去很强大,其实现原理却十分简单,其很巧妙地运用了矩阵运算的特点。对于需要进行冗余处理的n个原始数据,写成列向量形式(D),左边生成一个变换矩阵,这个矩阵由n+m行和n列组成,其中上面的n×n的部分是一个单元矩阵,保证原数据在编码后不发生变化,下面的m×n的部分是一个范德蒙矩阵,生成冗余纠错数据。使用范德蒙矩阵是为了保证这个矩阵任取n×n都部分可逆。
    在这里插入图片描述假设丢失了m个数据(包括原始数据和纠错数据),比如下图中D1、D4和C2丢失,需要从剩余的n个数据中恢复出原始数据D1 - Dn。从编码矩阵B中删除丢失数据和丢失编码对应行,将剩余的数据挑出来得到新n×n的矩阵B’。因为编码矩阵B的任意n行组成的矩阵都可逆,所以根据剩余的有效数据矩阵,即可把中间原始数据矩阵D解出来了。
    在这里插入图片描述上面的方法理论上能够做到数据冗余处理,不过由于作为一种编码技术,RS编码需要处理的是特定长度的二进制数据,然而求矩阵逆的过程是在实数域中进行的。显然特定长度的二进制是无法准确描述实数的。因此如何构造编码矩阵B成为关键。为了解决这个问题,RS的计算域采用能够用二进制精确编码的伽罗华域GF(2n)(有限域)。与平时熟知的自然域不同,在这个域里会有自己特有的加减乘除等算术规则,是基于多项式运算的,更多参考伽罗华域(Galois Field)上的四则运算。这个域的特性就是非常适合处理[0-2n)范围内数据的四则运算,而且这里的四则运算大都通过位运算处理,效率比较高。实际为了加快计算的过程,通常采用离散傅里叶变换及其逆变换来进行编码实现基于伽罗华域傅里叶变换的RS码识别方法。详细计算参考 ECC之Reed-Solomon算法

    二维码识别

    工业应用读码拍照,如果是丝印喷码,常见的白底黑码、或白码黑底,使用条形光源、环形光源等,都可以得到比较好的效果。而如果是在一些玻璃上激光打码,则建议使用同轴光源或高角度的环形光源。对于这种读码的应用,分辨率不需要太高。太高的分辨率,反而不一定能读取到码了。所以考虑使用30万~130万的工业相机即可。
    在这里插入图片描述

    图像处理方法

    一般来说,从摄像头或者扫描仪获得的DM码图像通常会包含较多噪声,且存在角度的倾斜和几何失真等问题,二维码图像识别主要包括图像预处理、条码定位和解码识别。
    在这里插入图片描述由于受实际环境中图像采集设备等影响,捕获的图像通常含有较多的噪声和失真,导致不能译码或者错误译码。为了提高二维码识别的可靠性,必须对图像进行有效的预处理。预处理首先对采集的彩色图像灰度化,在灰度图上图像滤波去噪,二值化图像,进行边缘提取。图像的二值化无通用方法,大部分DM解码器时利用Ostu法等进行处理。
    DM码可能占据图片中很大区域或者只占据小部分,因此快速有效地定位出条码区域是区分识别算法优劣的关键。利用DM码外部轮廓为矩形的特点,对图像进行矩形检测,可在图像中初步定位出条码位置。DM精确定位主要通过寻边区L型实线特征实现,采用遍历搜索方法,具体实现方法参考DataMatrix二维条形码解码器图像预处理研究。另一种方法利用距离为角度函数对条码边界进行标记,获取边界的位置和旋转角度。最后利用获取到的角度对条码进行仿射变换,将条码旋转到正方位置,进而进行条码解码,获取条码包含的数据信息。
    定位后的DM码进行图像取样,根据采样网格将将深浅模块转换为“1”和“0”矩阵;去除探测图形,提取出数据区,并得到条码尺寸和版本信息;调用模块放置矩阵恢复正确顺序的码字流;再确定数据码字和纠错码字,并进行条码数据的检错纠错;最终恢复原始数据,正确解码输出。

    基于开源库实现

    Data Matrix核心库为libdmtx和Zxing
    libdmtx采用的是遍历方法进行DM码区域检测及定位,至于里面的L形线检测,也都是遍历和邻域检测的,因为有有效的数据结构和网格划分,速度还是可以的。参考 datamatrix二维码开源解码库libdmtx的原理?
    解码流程:创建图像>创建解码器>寻找DM区域>DM解码
    libdmtx库用到4个主要的结构:

    • DmtxImage 保存着图像的属性以及一个指向像素数据的指针,这些像素数据保存在调用的程序里。
    • DmtxDecode 保存着控制解码行为和跟踪扫描过程的数值。当扫描一张新的图像,调用的程序需要每次重新创建新的DmtxDecode结构,而不是重用旧的结构。
    • DmtxRegion 以像素坐标定义了一个4边形的区域。区域可以从几乎任何方向获得,而且它们的拐角并不需要形成正确的角度。libdmtx 用它自己的结构来保存潜在条码的位置,程序调用方每调用一次获得一个位置。
    • DmtxMessage 保存着从条码提取出的解码信息。一个成功解码的区域将精确地产生一个的信息。
      具体实现参考二维码Data Matrix简介及在VS2010中的编译

    参考资料

    什么是 Data Matrix 码?
    DATA MATRIX BARCODE
    【Wiki】Data Matrix
    Datamatrix Generator
    纠删码(Erasure Code)浅析
    Reed-Solomon纠删码简析
    Erasure Codes for Storage Applications
    ECC之Reed-Solomon算法
    DataMatrix二维条形码解码器图像预处理研究
    二维码Data Matrix简介及在VS2010中的编译

    展开全文
  • 用C#实现的条形码和二维码编码解码器 原文用C#实现的条形码和二维码编码解码器 本篇介绍可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码;...
  • java二维码编码和解析

    2014-07-28 16:02:07
    * 解析二维码,返回解析内容   * @param imageFile   * @return   */   public static String qrCodeDecode(File imageFile) {   String decodedData = null ;   ...
  • 涵盖了多种常用二维码编码,解码的代码,算是个总结
  • EAN商品条形码亦称通用商品条形码,由国际物品编码协会制定,通用于世界各地,是目前国际上使用最广泛的一种商品条形码。我国目前在国内推行使用的也是这种商品条形码。EAN商品条形码分为EAN-13(标准版)和EAN-8...
  • 本篇介绍可以在C#中使用的1D/2D编码解码器。...二维码也开始应用到很多场合,如火车票有二维码识别、网易的首页有二维码图标,用户只需要用手机扫描一下就可以看到手机版网易的网址,免去了输入长串
  • EAN商品条形码亦称通用商品条形码,由国际物品编码协会制定,通用于世界各地,是目前国际上使用最广泛的一种商品条形码。我国目前在国内推行使用的也是这种商品条形码。EAN商品条形码分为EAN-13(标准版)和EAN-8...
  • 本篇介绍可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市的商品上面都印有条形码;二维码也开始应用到很多场合,如火车票有二维码识别,网易的首页有二维码图标,用户只需要用手机扫描一下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,680
精华内容 2,672
关键字:

二维码的编码规则