【问题标题】:EMVCo TLV string parser library for Javascript用于 Javascript 的 EMVCo TLV 字符串解析器库
【发布时间】:2023-03-08 21:38:01
【问题描述】:

我想解析一个 TLV 字符串,并在我给标签值时获取该值。

示例:

000201021642333310011114235204546757034445802IN5910我的 公司6005Vegas6304bb02

根据 TLV 规则,标签 52 将给出值 5467,57 将为 333。

【问题讨论】:

    标签: javascript node.js parsing tags tlv


    【解决方案1】:
    var str = '000201021642333310011114235204546757034445802IN5910My Company6005Vegas6304bb02';
    var headerLength = 6; // assuming header length is always 6
    var header = str.substring(0, 6);
    
    var tags = [];
    
    // start after header
    var i = 6;
    while (i < str.length) {
        var tag = str.substring(i, i + 2);
        i += 2;
        var valueLength = Number(str.substring(i, i + 2));
        i += 2;
        var value = str.substring(i, i + valueLength);
        i += valueLength;
        tags.push({tag: tag, value: value});
    }
    

    【讨论】:

      【解决方案2】:

      基于手动 EMVco 解析,例如我有一个 QR 内容(QR 印度尼西亚标准):00020101021226680016ID.CO.TELKOM.WWW011893600898025599662702150001952559966270303UMI51440014ID.CO.QRIS.WWW0215ID10200211817450303UMI520457325303360540825578.005502015802ID5916InterActive Corp6013KOTA SURABAYA61056013662130509413255111630439B7 所以我们可以这样解析它:

      var qris = '00020101021226680016ID.CO.TELKOM.WWW011893600898025599662702150001952559966270303UMI51440014ID.CO.QRIS.WWW0215ID10200211817450303UMI520457325303360540825578.005502015802ID5916InterActive Corp6013KOTA SURABAYA61056013662130509413255111630439B7'
      
      var tags = [];
      
      var i = 0;
      while (i < qris.length) {
          var tag = qris.substring(i, i + 2);
          i += 2;
          var valueLength = Number(qris.substring(i, i + 2));
          i += 2;
          var value = qris.substring(i, i + valueLength);
          i += valueLength;
          tags.push({tag: tag, length: valueLength, value: value});
      }
      
      console.log(tags)
      

      结果将是一个对象数组,如下所示:

      [
        { tag: '00', length: 2, value: '01' },
        { tag: '01', length: 2, value: '12' },
        {
          tag: '26',
          length: 68,
          value: '0016ID.CO.TELKOM.WWW011893600898025599662702150001952559966270303UMI'
        },
        {
          tag: '51',
          length: 44,
          value: '0014ID.CO.QRIS.WWW0215ID10200211817450303UMI'
        },
        { tag: '52', length: 4, value: '5732' },
        { tag: '53', length: 3, value: '360' },
        { tag: '54', length: 8, value: '25578.00' },
        { tag: '55', length: 2, value: '01' },
        { tag: '58', length: 2, value: 'ID' },
        { tag: '59', length: 16, value: 'InterActive Corp' },
        { tag: '60', length: 13, value: 'KOTA SURABAYA' },
        { tag: '61', length: 5, value: '60136' },
        { tag: '62', length: 13, value: '0509413255111' },
        { tag: '63', length: 4, value: '39B7' }
      ]
      

      【讨论】:

        【解决方案3】:

        这不是 EMV 使用的 BER-TLV 编码示例。您的数据示例将标记值表示为字符串/ASCII,而不是二进制。

        所以你需要自己的数据解析器:

        • 标签 - 2个字符,这些是自定义标签,不是EMV;
        • 长度 - 十进制,2 个字符;
        • 值 - ASCII 格式,带有提到的十进制长度;

        这种格式比真正的BER TLV更简单,但是你需要开发自己的功能。

        分裂的结果是:

        000201 // some header
        02 16 4233331001111423
        52 04 5467
        57 03 444
        58 02 IN
        59 10 My Company
        60 05 Vegas
        63 04 bb02
        

        【讨论】:

        • 谢谢。我知道如何手动解析它。我正在寻找可以在 Javascript 中使用的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        相关资源
        最近更新 更多