Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EMV TLV解析有时不显示构造的值(child)_Java_Format_Emv_Tlv_Ber - Fatal编程技术网

Java EMV TLV解析有时不显示构造的值(child)

Java EMV TLV解析有时不显示构造的值(child),java,format,emv,tlv,ber,Java,Format,Emv,Tlv,Ber,我的方法parseTLV()有时不能正确地分解为构造值(子TLV)。我使用过滤器((tag&0x20)!=0)来检测构造的值,但有时它不能按预期工作 比如说 70178C159F02069F03069F1A0295055F2A029A039C019F3704 如果没有完全遵守EMV标准,您的代码可能会因以下常见原因而失败 标记的长度可能超过两个字节(根据代码,您处理的标记不会超过两个字节。但是,遇到标记的可能性很低) 长度可能超过一个字节(尽管通常长度为一个字节) 如果您尝试将标记与列表进行比

我的方法
parseTLV()
有时不能正确地分解为构造值(子TLV)。我使用过滤器
((tag&0x20)!=0)
来检测构造的值,但有时它不能按预期工作

比如说

70178C159F02069F03069F1A0295055F2A029A039C019F3704
如果没有完全遵守EMV标准,您的代码可能会因以下常见原因而失败

  • 标记的长度可能超过两个字节(根据代码,您处理的标记不会超过两个字节。但是,遇到标记的可能性很低)
  • 长度可能超过一个字节(尽管通常长度为一个字节)
  • 如果您尝试将标记与列表进行比较,EMV引入的任何新标记都将失败(如果不进行比较,请忽略此项)

EMV 4.3第3册附录B BER-TLV数据对象规则B1、B2、B3节是正确的查找位置。如果您严格遵循这一点,以上所有问题都可以避免。

如果没有完全遵守EMV标准,您的代码可能会因以下常见原因而失败

  • 标记的长度可能超过两个字节(根据代码,您处理的标记不会超过两个字节。但是,遇到标记的可能性很低)
  • 长度可能超过一个字节(尽管通常长度为一个字节)
  • 如果您尝试将标记与列表进行比较,EMV引入的任何新标记都将失败(如果不进行比较,请忽略此项)

EMV 4.3第3册附录B BER-TLV数据对象规则B1、B2、B3节是正确的查找位置。如果您严格遵循这一点,则可以避免上述所有情况。

标记
8C
不包含构造值。因此,对
((标记&0x20)!=0)
的测试将正确失败。相反,TLV包含一个数据对象列表作为其值。当您查看值9F02069F03069F1A0295055F2A029A039C019F3704时,您会发现这些不是完整的TLV对象,而是标记+长度


因此,您必须根据标记确定TLV对象是否包含数据对象列表。然后,您可以以与解析完整TLV对象类似的方式解析该列表,只是跳过空值字段。

标记
8C
不包含构造值。因此,对
((标记&0x20)!=0)
的测试将正确失败。相反,TLV包含一个数据对象列表作为其值。当您查看值9F02069F03069F1A0295055F2A029A039C019F3704时,您会发现这些不是完整的TLV对象,而是标记+长度


因此,您必须根据标记确定TLV对象是否包含数据对象列表。然后,您可以以与解析完整TLV对象类似的方式解析该列表,只是跳过空值字段。

谢谢,先生,我的代码支持两个字节的标记和两个字节的长度。谢谢,先生,我的代码支持两个字节的标记和两个字节的长度。
private ITlv.ITlvDataObjList parseTLV(byte[] src) {
    try {
        if (isBytesEmpty(src)) {
            return null;
        }
        _tlvList = _tlv.createTlvDataObjectList();
        int start = 0;
        int end = start + src.length;
        while (start < end) {
            // tag has 1 byte (0xFF)
            int tag = src[start++] & 0xFF;
            //
            if (tag == 0x00 || tag == 0xFF) {
                continue;
            }
            // tag has more bytes?
            if ((tag & 0x1F) == 0x1F) {
                if (start >= src.length) {
                    break;
                }
                // tag has 2 bytes (0xFFFF)
                tag = (tag << 8) | src[start++] & 0xFF;
                // tag has 3 bytes (0xFFFFFF)
                if ((tag & 0x80) != 0) {
                    if (start >= src.length) {
                        break;
                    }
                    tag = (tag << 8) | src[start++] & 0xFF;
                }
                // break when tag > 3 bytes
                if ((tag & 0x80) != 0) {
                    continue;
                }
            }
            // length 1 byte (0x7F)
            int length = src[start++] & 0xFF;
            // length has more bytes?
            if (length >= 0x80) {
                // break when length > 2 bytes 
                int count = length & 0x7F;
                if (count > 3) {
                    continue;
                }
                // length 1 bytes (0x80-0xFF) or 2 bytes (0x100-0xFFFF)
                length = 0;
                for (int k = 0; k < count; k++) {
                    if (start >= src.length) {
                        break;
                    }
                    length = (length << 8) | src[start++] & 0xFF;
                }
            }
            // values
            byte[] value = new byte[length];
            System.arraycopy(src, start, value, 0, length);
            //
            // create tlv object
            ITlv.ITlvDataObj tlvObj = _tlv.createTlvDataObject();
            tlvObj.setTag(tag);
            tlvObj.setValue(value);
            // save tlv object to list
            _tlvList.addDataObj(tlvObj);
            //
            // next tag
            while (tag > 0xFF) {
                tag = tag >> 8;
            }
            // is constructed (has child)?
            if ((tag & 0x20) != 0) {
                continue;
            }
            start = start + value.length;
        }
        return _tlvList;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}