Java-функция EMV TLV

Я ищу способ перевести ответ EMV с помощью Java, например, с помощью этой онлайн-опции:

http://www.emvlab.org/tlvutils/

где вы помещаете что-то вроде этого ответа EMV:

6f3a8407a0000000031010a52f500b56495341204352454449548701015f2d086573656e707466729f12074352454449544f9f1101019f38039f1a02

и он покажет вам все отлично, я начал что-то делать сам, но потом я понял, что, возможно, у нас могли бы быть две строки 9F38 (PDOL), не обязательно два одинаковых тега, потому что я знаю, что это невозможно, но, возможно, значение тега заканчивается на 9F и начало следующего тега будет 38, и это выдаст мне ошибку... Теперь, когда я упомянул об этом, возможно ли это? потому что это была одна из главных причин, почему я перестал выполнять свою собственную функцию..

Кто-нибудь из вас уже написал функцию для этого?

Спасибо!


person JuanD    schedule 04.05.2013    source источник


Ответы (4)


https://github.com/binaryfoo/emv-bertlv должно помочь.

Используя ваш пример, следующий код:

List<DecodedData> decoded = new RootDecoder().decode("6f3a8407a0000000031010a52f500b56495341204352454449548701015f2d086573656e707466729f12074352454449544f9f1101019f38039f1a02", "EMV", "constructed");
new DecodedWriter(System.out).write(decoded, "");

Выведет:

[6F (FCI template)] 8407A0000000031010A52F500B56495341204352454449548701015F...1A02
[84 (dedicated file name)] A0000000031010
[A5 (FCI proprietary template)] 500B56495341204352454449548701015F2D086573656E707466729F...1A02
  [50 (application label)] VISA CREDIT
  [87 (application priority indicator)] 01
  [5F2D (language preference)] esenptfr
  [9F12 (application preferred name)] CREDITO
  [9F11 (issuer code table index)] 01
  [9F38 (PDOL - Processing data object list)] 9F1A02
    9F1A (terminal country code) 2 bytes
person aussie1984    schedule 07.11.2014

В этом проекте есть код для работы с данными EMV http://code.google.com/p/javaemvreader/< /а>

person arved    schedule 18.12.2013

Ты на правильном пути. Вы можете легко создать свой собственный синтаксический анализатор EMV, используя метод вызова TLV (значение длины тега). Ваши необработанные данные всегда возвращаются с тегом, затем после того, как тег является длиной, использование длины может дать вам значение.

Итак, создайте три метода

метод 1: содержит все короткие теги; метод 2: содержит все длинные теги; метод 3: содержит все проприетарные теги.

Итак, когда вы передаете свой необработанный тег emv:

6f3a8407a0000000031010a52f500b56495341204352454449548701015f2d086573656e707466729f12074352454449544f9f1101019f38039f1a02

Переберите все эти три метода, это даст вам всю необходимую информацию.

person jjlei    schedule 01.03.2017

Используйте функцию ниже, которая даст вам хэш-карту значения TLV.

public LinkedHashMap parseBERTLVTag(String tlv) throws DecoderException
{
    if(tlv==null || "".equalsIgnoreCase(tlv)){
        return null;
    }

    System.out.println("============= START ["+tlv+"]==================");


    boolean inTagRead= true;
    Map<String,String> tags= new HashMap<>();

    StringBuilder _tmp = new StringBuilder();
    String lastTag = "";
    int old_index = 0;
    boolean isFirstTagByte = true;
    int len = 0;
    boolean more=true;
    String data = "";
    while (more)
    {
        len = 0;
        String hByte = tlv.substring(old_index,(old_index = old_index+2));
        if(inTagRead)
        {
            if(isLastTagByte(hByte, isFirstTagByte))
            {
                inTagRead=false;
                _tmp.append(hByte);
                lastTag =  _tmp.toString();
                System.out.println("Tag["+lastTag+"]");
                tags.put(lastTag, null);
                _tmp= new StringBuilder();
            }else
            {
                _tmp.append(hByte);
            }

            isFirstTagByte = false;

        }else//Length
        {

            isFirstTagByte = true;


            if(isLastLengthByte(hByte)) {
                inTagRead=true;
                _tmp.append(hByte);
                len =  Integer.parseInt(_tmp.toString(), 16 );
                //read len*2
                System.out.println(" Length ["+len+"]");
                data =  tlv.substring(old_index, (old_index = old_index+len*2));
                String tmpData= lastTag+":"+_tmp.toString()+":h"+data;
                System.out.println(" Data ["+tmpData+"]");
                _tmp = new StringBuilder();

                tags.put(lastTag, tmpData);

            }else
            {
                _tmp.append(hByte);
            }

        }

        more= tlv.length()<=old_index?false:true;

        System.out.println("tag "+lastTag+" value "+data+"  length "+len);

        if(lastTag.length() > 0 && data.length() > 0 && len > 0){

            if(!map.containsKey(lastTag)){

                map.put(lastTag,new TLVModel().setTag(lastTag).setLength(len).setValue(data));
            }
        }

    }//END OF WHILE


    System.out.println("------------  as MAP  ---------------------");
    System.out.println("size "+map.size());

    for (Map.Entry mp:map.entrySet()){
        System.out.println("key  "+mp.getKey()+"  value "+mp.getValue());
    }

    return map.size() > 0 ? map : null;
}
person sanil    schedule 25.09.2019