tlv 格式解析

<pre name="code" class="java">/**
 * 將字符串轉換爲TLV對象
 * 
 */
public abstract class TlvUtils {

	/**
	 * 將16進制字符串轉換爲TLV對象列表
	 * @param hexString
	 * @return
	 */
	public static List<Tlv> builderTlvList(String hexString) {
		List<Tlv> tlvs = new ArrayList<Tlv>();

		int position = 0;
		while (position != StringUtils.length(hexString)) {
			String _hexTag = getTag(hexString, position);
			position += _hexTag.length();

			LPositon l_position = getLengthAndPosition(hexString, position);
			int _vl = l_position.get_vL();

			position = l_position.get_position();

			String _value = StringUtils.substring(hexString, position, position + _vl * 2);

			position = position + _value.length();

			tlvs.add(new Tlv(_hexTag, _vl, _value));
		}
		return tlvs;
	}
	
	/**
	 * 將16進制字符串轉換爲TLV對象MAP
	 * @param hexString
	 * @return
	 */
	public static Map<String, Tlv> builderTlvMap(String hexString) {

		Map<String, Tlv> tlvs = new HashMap<String, Tlv>();

		int position = 0;
		while (position != hexString.length()) {
			String _hexTag = getTag(hexString, position);
			
			position += _hexTag.length();
			
			LPositon l_position = getLengthAndPosition(hexString, position);
			
			int _vl = l_position.get_vL();
			position = l_position.get_position();
			String _value = hexString.substring(position, position + _vl * 2);
			position = position + _value.length();
			
			tlvs.put(_hexTag, new Tlv(_hexTag, _vl, _value));
		}
		return tlvs;
	}
	
	/**
	 * 返回最後的Value的長度
	 * 
	 * @param hexString
	 * @param position
	 * @return 
	 */
	private static LPositon getLengthAndPosition(String hexString, int position) {
		String firstByteString = hexString.substring(position, position + 2);
		int i = Integer.parseInt(firstByteString, 16);
		String hexLength = "";

		if (((i >>> 7) & 1) == 0) {
			hexLength = hexString.substring(position, position + 2);
			position = position + 2;
		} else {
			// 當最左側的bit位爲1的時候,取得後7bit的值,
			int _L_Len = i & 127;
			position = position + 2;
			hexLength = hexString.substring(position, position + _L_Len * 2);
			// position表示第一個字節,後面的表示有多少個字節來表示後面的Value值
			position = position + _L_Len * 2;
		}
		return new LPositon(Integer.parseInt(hexLength, 16), position);

	}

	/**
	 * 取得子域Tag標籤
	 * 
	 * @param hexString
	 * @param position
	 * @return
	 */
	private static String getTag(String hexString, int position) {
		String firstByte = StringUtils.substring(hexString, position, position + 2);
		int i = Integer.parseInt(firstByte, 16);
		if ((i & 0x1f) == 0x1f) {
			return hexString.substring(position, position + 4);

		} else {
			return hexString.substring(position, position + 2);
		}
	}
}



/**
 * value的長度
 */
public class LPositon {

	private int _vL;
	private int _position;

	public LPositon(int _vL, int position) {
		this._vL = _vL;
		this._position = position;
	}

	public int get_vL() {
		return _vL;
	}

	public void set_vL(int _vL) {
		this._vL = _vL;
	}

	public int get_position() {
		return _position;
	}

	public void set_position(int _position) {
		this._position = _position;
	}
}

TLV:TLV格式數據是指由Tag,Length,Value組成的數據。具體說明如下:


Type和Length的長度固定,一般那是2、4個字節(這裏統一採用4個字節);

Value的長度有Length指定

編碼格式:

1.       將類型type轉換爲網絡字節順序,指針偏移+4

2.       將長度length轉換爲網絡字節順序,指針偏移+4

3.       若值value數據類型爲int、char、short,則將其轉換爲網絡字節順序,指針偏移+4;若值爲字符串類型,寫進後,指針偏移+length

……繼續處理後面的tlv;

解碼格式:(和編碼格式相反)


類型(Type)字段是關於標籤和編碼格式的信息;

長度 (Length)字段定義數值的長度;

內容(Value)字段表示實際的數值。


public class Tlv {


/** 子域Tag標籤 */
private String tag;


/** 子域取值的長度 */
private int length;


/** 子域取值 */
private String value;


public Tlv(String tag, int length, String value) {
this.length = length;
this.tag = tag;
this.value = value;
}


public String getTag() {
return tag;
}


public void setTag(String tag) {
this.tag = tag;
}


public int getLength() {
return length;
}


public void setLength(int length) {
this.length = length;
}


public String getValue() {
return value;
}


public void setValue(String value) {
this.value = value;
}


@Override
public String toString() {
return "tag=[" + this.tag + "]," + "length=[" + this.length + "]," + "value=[" + this.value + "]";
}
}


http://my.oschina.net/maxid/blog/206546


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章