<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