Emvco 支付二維碼

Emvco 的格式分為兩種 Consumer 和 Merchant  
兩種格式都使用了 TLV(tag-length-value) 這樣的數(shù)據(jù)結(jié)構(gòu)組成

TLV

也就是 tag-length-value 這樣的數(shù)據(jù)結(jié)構(gòu)格式,tag表示顯示的值是的意義,length表示value的字節(jié)長度,value則是tag具體對應(yīng)的值
比如:6304c8b2
tag: 63
length: 04
value: c8b2
一個最小單位的tlv數(shù)據(jù)就是這樣組成的,除了直接 tlv,還可以使用 tltlv 這樣的嵌套結(jié)構(gòu)

Emvco Merchant

tlv 字符串拼接成一個代表 Emvco 的字符串,包含了根據(jù)公司需要的一些特定的數(shù)據(jù)內(nèi)容,Emv官方文檔 對某些特定的 tag 做了規(guī)定。

CRC16

Emvco Merchant 使用 CRC16 進(jìn)行驗(yàn)證字符串,在最后面添加 6304 然后計(jì)算出對應(yīng)的 CRC16值添加到最后面就組成了一個完整的 Emvco Merchant 支付字符串
計(jì)算方式采用 CCITT_FALSE 方式進(jìn)行計(jì)算,在線計(jì)算CRC16
步驟:

  • 字符串轉(zhuǎn) 16 進(jìn)制字符串
  • 字符串轉(zhuǎn)字節(jié)碼數(shù)組
  • 通過位移計(jì)算 CRC16 字符串

通過字節(jié)數(shù)組計(jì)算 CRC16 (kotlin)

    private fun computeCRC16_CCITT_FALSE(bytes: ByteArray): Int {
        // initial value
        var crc = 0xffff
        // polynial value
        val polynomial = 0x1021
        for (index in bytes.indices) {
            val b = bytes[index]
            for (i in 0..7) {
                val bit = b.toInt() shr 7 - i and 1 == 1
                val c15 = crc shr 15 and 1 == 1
                crc = crc shl 1
                if (c15 xor bit)
                    crc = crc xor polynomial
            }
        }
        crc = crc and 0xffff
        return crc
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 依舊那么的突然。 這是一個閱兵儀式上,一個大胡子的領(lǐng)導(dǎo)人一邊走一邊在說。走到觀禮臺,只有熙熙攘攘的人在興奮的鼓掌,...
    過江翁閱讀 229評論 0 0
  • 前幾日姑姑家的妹妹來找我玩,我長她六歲,她是三個妹妹中最與我交好的,也難怪,畢竟我們在一起的日子最多,用她的話講“...
    停下的貓閱讀 486評論 0 1
  • 1,感受自我內(nèi)在的豐盛 精神,物質(zhì)好比身上兩腿!一左一右,一前一后,一上一下!和諧,美好! 2,感受身體情緒的豐盛...
    紫貝殼張翠萍閱讀 222評論 0 1

友情鏈接更多精彩內(nèi)容