EMV TLV Java函数

EMV TLV Java函数,java,function,emv,tlv,Java,Function,Emv,Tlv,我正在寻找一种使用Java翻译EMV响应的方法,类似于使用以下在线选项: 在这里,您可以放置类似以下EMV响应的内容: 6F3A8407A0000000031010A52F500B564995341204352454449548701015F2D086573656E707466729F1207452454449544F9F1101019F38039F1A02 它将完美地展示一切,我开始自己做一些事情,但后来我意识到,也许我们可以有两个9F38(PDOL)字符串,不需要两个相同的标记,因为我知道

我正在寻找一种使用Java翻译EMV响应的方法,类似于使用以下在线选项:

在这里,您可以放置类似以下EMV响应的内容:

6F3A8407A0000000031010A52F500B564995341204352454449548701015F2D086573656E707466729F1207452454449544F9F1101019F38039F1A02

它将完美地展示一切,我开始自己做一些事情,但后来我意识到,也许我们可以有两个9F38(PDOL)字符串,不需要两个相同的标记,因为我知道这是不可能的,但也许一个标记的值以9F结束,下一个标记的开始是38,这会给我一个错误。。。既然我提到了,那有可能吗?因为这是我停止做我自己的功能的主要原因之一

你们中有没有人已经编写了一个函数来实现这一点


谢谢

这个项目有处理EMV数据的代码

应该可以

使用您的示例,将显示以下代码:

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

你在正确的轨道上。您可以使用技术调用TLV(标记长度值)轻松构建自己的EMV解析器。您的原始数据总是带着标记返回,然后在标记之后是长度,使用长度可以得到值

因此,创建三种方法

方法1:包含所有短标记 方法2:包含所有长标记 方法3:包含所有专有标记

因此,当您传入原始emv标签时:

6F3A8407A0000000031010A52F500B564995341204352454449548701015F2D086573656E707466729F1207452454449544F9F1101019F38039F1A02


循环使用这三种方法,它将为您提供所需的所有信息

使用下面的函数,它将为您提供TLV值的hashmap

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;
}
public LinkedHashMap parseBERTLVTag(字符串tlv)抛出DecoderException
{
如果(tlv==null | |“”.equalsIgnoreCase(tlv)){
返回null;
}
System.out.println(“=======================================================================================================”;
布尔整数=真;
Map tags=newhashmap();
StringBuilder_tmp=新的StringBuilder();
字符串lastTag=“”;
int old_指数=0;
布尔值isFirstTagByte=true;
int len=0;
布尔更多=真;
字符串数据=”;
而(更多)
{
len=0;
字符串hByte=tlv.substring(old_index,(old_index=old_index+2));
如果(凹版)
{
if(isLastTagByte(hByte,isFirstTagByte))
{
inTagRead=假;
_tmp.append(hByte);
lastTag=_tmp.toString();
System.out.println(“Tag[“+lastTag+”]);
tags.put(lastTag,null);
_tmp=新的StringBuilder();
}否则
{
_tmp.append(hByte);
}
isFirstTagByte=false;
}else//长度
{
isFirstTagByte=true;
if(isLastLengthByte(hByte)){
inTagRead=真;
_tmp.append(hByte);
len=Integer.parseInt(_tmp.toString(),16);
//读len*2
System.out.println(“长度[“+len+”]);
数据=tlv子字符串(旧索引,(旧索引=旧索引+len*2));
字符串tmpData=lastTag+“:”+u tmp.toString()+“:h”+数据;
System.out.println(“数据[“+tmpData+”]);
_tmp=新的StringBuilder();
tags.put(lastTag,tmpData);
}否则
{
_tmp.append(hByte);
}
}
更多=tlv.length()0&&data.length()>0&&len>0){
如果(!map.containsKey(lastTag)){
map.put(lastTag,new TLVModel().setTag(lastTag).setLength(len).setValue(data));
}
}
}//结束
System.out.println(“--------------如图-----------------”;
System.out.println(“size”+map.size());
对于(Map.Entry mp:Map.entrySet()){
System.out.println(“key”+mp.getKey()+“value”+mp.getValue());
}
返回map.size()>0?map:null;
}
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;
}