7

我是 Java 新手,所以我想将标准解决方案用于标准任务。标签和值的长度是未知的。

4

6 回答 6

6

您可以使用这个 BER-TLV 解析器:git 上的源代码
示例:

如何解析

byte[] bytes = HexUtil.parseHex("50045649534157131000023100000033D44122011003400000481F");
BerTlvParser parser = new BerTlvParser(LOG);
BerTlvs tlvs = parser.parse(bytes, 0, bytes.length);

如何建造

byte[] bytes =  new BerTlvBuilder()
                .addHex(new BerTag(0x50), "56495341")
                .addHex(new BerTag(0x57), "1000023100000033D44122011003400000481F")
                .buildArray();

Maven依赖

<dependency>
  <groupId>com.payneteasy</groupId>
  <artifactId>ber-tlv</artifactId>
  <version>1.0-10</version>
</dependency>
于 2017-07-05T15:05:41.193 回答
2

此处的教程提供了有关如何解析 BER-TLV 的提示。使用JACCAL

于 2012-11-21T07:10:34.993 回答
1

javaemvreader项目包含一些解析 BER-TLV 的代码。

于 2016-08-29T21:49:59.243 回答
0

我找到了 BER TLV 的Javacard类。希望那些帮助

于 2012-10-23T06:39:41.597 回答
0

我根据此处提供的信息制作了一个简单的解析器:http: //www.codeproject.com/Articles/669147/Simple-TLV-Parser

我不知道这段代码是否支持所有标准,但它对我有用。

public static Map<String, String> parseTLV(String tlv) {
    if (tlv == null || tlv.length()%2!=0) {
        throw new RuntimeException("Invalid tlv, null or odd length");
    }
    HashMap<String, String> hashMap = new HashMap<String, String>();
    for (int i=0; i<tlv.length();) {
        try {
            String key = tlv.substring(i, i=i+2);

            if ((Integer.parseInt(key,16) & 0x1F) == 0x1F) {
                // extra byte for TAG field
                key += tlv.substring(i, i=i+2);
            }
            String len = tlv.substring(i, i=i+2);
            int length = Integer.parseInt(len,16);

            if (length > 127) {
                // more than 1 byte for lenth
                int bytesLength = length-128;
                len = tlv.substring(i, i=i+(bytesLength*2));
                length = Integer.parseInt(len,16);
            }
            length*=2;

            String value = tlv.substring(i, i=i+length);
            //System.out.println(key+" = "+value);
            hashMap.put(key, value);
        } catch (NumberFormatException e) {
            throw new RuntimeException("Error parsing number",e);
        } catch (IndexOutOfBoundsException e) {
            throw new RuntimeException("Error processing field",e);
        }
    }

    return hashMap;
}
于 2013-11-14T20:24:19.310 回答
0

可能这个免费库对您有用。我用这个来进行简单的 TLV 解析。无论如何,它具有 MIT 许可证,您可以对其进行修改。

https://github.com/VakhoQ/tlv-encoder
于 2017-12-14T11:41:50.640 回答