I made a simple parser based on the information provided here: http://www.codeproject.com/Articles/669147/Simple-TLV-Parser
I don't know if this code supports the entire standard, but it works for me.
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; }
source share