EMV TLV Java函数
我正在寻找一种使用Java翻译EMV响应的方法,类似于使用以下在线选项: 在这里,您可以放置类似以下EMV响应的内容: 6F3A8407A0000000031010A52F500B564995341204352454449548701015F2D086573656E707466729F1207452454449544F9F1101019F38039F1A02 它将完美地展示一切,我开始自己做一些事情,但后来我意识到,也许我们可以有两个9F38(PDOL)字符串,不需要两个相同的标记,因为我知道这是不可能的,但也许一个标记的值以9F结束,下一个标记的开始是38,这会给我一个错误。。。既然我提到了,那有可能吗?因为这是我停止做我自己的功能的主要原因之一 你们中有没有人已经编写了一个函数来实现这一点EMV TLV Java函数,java,function,emv,tlv,Java,Function,Emv,Tlv,我正在寻找一种使用Java翻译EMV响应的方法,类似于使用以下在线选项: 在这里,您可以放置类似以下EMV响应的内容: 6F3A8407A0000000031010A52F500B564995341204352454449548701015F2D086573656E707466729F1207452454449544F9F1101019F38039F1A02 它将完美地展示一切,我开始自己做一些事情,但后来我意识到,也许我们可以有两个9F38(PDOL)字符串,不需要两个相同的标记,因为我知道
谢谢 这个项目有处理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;
}