Я новичок в Java, поэтому я хотел бы использовать стандартное решение для, я думаю, стандартной задачи. Длина тегов и значений не известна.
Есть ли синтаксический анализатор Java для BER-TLV?
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
Я сделал простой синтаксический анализатор на основе информации, предоставленной здесь: 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
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