Есть ли синтаксический анализатор Java для BER-TLV?

Я новичок в Java, поэтому я хотел бы использовать стандартное решение для, я думаю, стандартной задачи. Длина тегов и значений не известна.


person Zharro    schedule 13.07.2012    source источник
comment
может быть это тот, который вам нужен? github.com/VakhoQ/tlv-encoder   -  person grep    schedule 14.12.2017


Ответы (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>
person Maksym Pecheniuk    schedule 05.07.2017

Учебное пособие в здесь дает советы о том, как анализировать BER-TLV. Использование JACCAL

person HelmiB    schedule 21.11.2012
comment
это фантастика! - person null; 19.08.2015
comment
голосование против из-за битой ссылки - person eigenfield; 15.06.2020

Проект javaemvreader содержит некоторый код для разбора BER-TLV.

person vlp    schedule 29.08.2016

Я нашел классы Javacard для BER TLV. Надеюсь на помощь

person Ayman    schedule 23.10.2012

Я сделал простой синтаксический анализатор на основе информации, предоставленной здесь: 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;
}
person Ignacio A. Poletti    schedule 14.11.2013
comment
simple-tlv отличается от ber-tlv, и простой синтаксический анализатор tlv часто дает сбой на данных ber-tvl. - person K.L.; 26.11.2014

Возможно, вам будет полезна эта бесплатная библиотека. Я использовал это для простого разбора TLV. В любом случае, это с лицензией MIT, и вы можете изменить ее.

https://github.com/VakhoQ/tlv-encoder
person grep    schedule 14.12.2017