tlv 格式解析
来源:互联网 发布:数据分析师适合女生嘛 编辑:程序博客网 时间:2024/04/20 23:04
<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
- tlv 格式解析
- java解析TLV格式数据
- java解析TLV格式数据
- tlv解析
- PBOC2.0/EMV之TLV格式解析(C++)
- TLV格式是什么格式
- TLV 格式及编码
- TLV格式及编码
- TLV 格式及编码
- TLV 格式及编码
- 【TLV格式及编码】
- TLV格式说明
- TLV 格式及编码
- tlv - 可变编码格式
- TLV格式及编码
- TLV 解析(Java)
- TLV解析java
- TLV报文解析
- Volley的Get、Post方式(JsonObjectRequest、StringRequest)以及Volley获取图片的3种方式
- js运动框架完美运动框架2--这个才有效
- flash音乐重复播放的问题
- 国外优秀的数据库实用工具介绍
- 解决Linux下cocos2dx找不到头文件Box2D的问题
- tlv 格式解析
- mysql分表和表分区详解
- UML建模系列-类图(Class diagram)
- kmp的next数组值得求法
- 安装7-Zip
- 某场CF B Octagons(模拟)
- swift语法,很全的总结,强烈推荐 http://wiki.jikexueyuan.com/project/swift/
- 神舟笔记本 买了一个 战神 笔记本 8199 字母键 坏了 退货 打电话 不接 售后 和客户 不行 本人 亲身经历 如有 疑问 请不要联系我
- hdu 5360 Hiking