赞
踩
TLV:TLV格式数据是指由Tag,Length,Value组成的数据。具体说明如下:
tag标签的属性为bit,由16进制表示,占1~2个字节长度。例如,“9F33”为一个占用两个字节 的tag标签。而“95”为一个占用一个字节的tag标签。若tag标签的第一个字节(注:字节排序方向为从左往右数,第一个字节即为最左边的字节。bit排序规则同理。)的后四个bit为“1111”,则说明该tag占两个字节,例如“9F33”;否则占一个字节,例“95”。
子域长度(即L本身)的属性也为bit,占1~3个字节长度。具体编码规则如下:
a) 当 L 字段最左边字节的最左 bit 位(即 bit8)为 0,表示该 L 字段占一个字节,它的后续 7个 bit 位(即 bit7~bit1)表示子域取值的长度,采用二进制数表示子域取值长度的十进制数。例如,某个域取值占 3 个字节,那么其子域取值长度表示为“00000011”。所以,若子域取值的长度在 1~127 字节之间,那么该 L 字段本身仅占一个字节。
b) 当 L 字段最左边字节的最左 bit 位(即 bit8)为 1,表示该 L 字段不止占一个字节,那么它到底占几个字节由该最左字节的后续 7 个 bit 位(即 bit7~bit1)的十进制取值表示。例如,若最左字节为 10000010,表示 L 字段除该字节外,后面还有两个字节。其后续字节的十进制
取值表示子域取值的长度。例如,若 L 字段为“1000 0001 1111 1111”,表示该子域取值占255 个字节。所以,若子域取值的长度在 127~255 字节之间,那么该 L 字段本身需占两个字节。
解析代码如下:
publicclassTlv {
/** 子域Tag标签 */
privateString tag;
/** 子域取值的长度 */
privateintlength;
/** 子域取值 */
privateString value;
publicTlv(String tag,intlength, String value) {
this.length = length;
this.tag = tag;
this.value = value;
}
publicString getTag() {
returntag;
}
publicvoidsetTag(String tag) {
this.tag = tag;
}
publicintgetLength() {
returnlength;
}
publicvoidsetLength(intlength) {
this.length = length;
}
publicString getValue() {
returnvalue;
}
publicvoidsetValue(String value) {
this.value = value;
}
@Override
publicString toString() {
return"tag=["+this.tag +"],"+"length=["+this.length +"],"+"value=["+this.value +"]";
}
}
TLV解析类:
/**
* 将字符串转换为TLV对象
*
*/
publicabstractclassTlvUtils {
/**
* 将16进制字符串转换为TLV对象列表
* @param hexString
* @return
*/
publicstaticList builderTlvList(String hexString) {
List tlvs = newArrayList();
intposition =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(newTlv(_hexTag, _vl, _value));
}
returntlvs;
}
/**
* 将16进制字符串转换为TLV对象MAP
* @param hexString
* @return
*/
publicstaticMap builderTlvMap(String hexString) {
Map tlvs = newHashMap();
intposition =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, newTlv(_hexTag, _vl, _value));
}
returntlvs;
}
/**
* 返回最后的Value的长度
*
* @param hexString
* @param position
* @return
*/
privatestaticLPositon getLengthAndPosition(String hexString,intposition) {
String firstByteString = hexString.substring(position, position + 2);
inti = 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;
}
returnnewLPositon(Integer.parseInt(hexLength,16), position);
}
/**
* 取得子域Tag标签
*
* @param hexString
* @param position
* @return
*/
privatestaticString getTag(String hexString,intposition) {
String firstByte = StringUtils.substring(hexString, position, position + 2);
inti = Integer.parseInt(firstByte,16);
if((i &0x1f) ==0x1f) {
returnhexString.substring(position, position +4);
} else{
returnhexString.substring(position, position +2);
}
}
}
LPosition类内容如下:
/**
* value的长度
*/
publicclassLPositon {
privateint_vL;
privateint_position;
publicLPositon(int_vL,intposition) {
this._vL = _vL;
this._position = position;
}
publicintget_vL() {
return_vL;
}
publicvoidset_vL(int_vL) {
this._vL = _vL;
}
publicintget_position() {
return_position;
}
publicvoidset_position(int_position) {
this._position = _position;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。