有项目使用到了TLV组解包的模式,特意在此记录,以供参考:

/**

* 将字符串转换为TLV对象

* Created by ZFR on 2019/5/29.

*/

public class TlvUtils {

/**

* 将16进制字符串转换为TLV对象列表

*

* @param hexString

* @return

*/

public static ListbuilderTlvList(String hexString) {

Listtlvs = new ArrayList();

int position = 0;

while (position != StringUtils.length(hexString)) {

String _hexTag = getTag(hexString, position);

Log.d("zfr-_hexTag:===", _hexTag);

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 TLV2(_hexTag, _vl, _value));

}

return tlvs;

}

/**

* 将16进制字符串转换为TLV对象MAP

*

* @param hexString

* @return

*/

public static MapbuilderTlvMap(String hexString) {

Maptlvs = new HashMap();

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 TLV2(_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 + 4);

Log.d("zfr-firstByteString====", firstByteString);

return new LPositon(Integer.parseInt(zfrUtils.toStringHex(firstByteString)), position + 4);

/*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 + 4);

Log.d("zfr-firstByte:==", firstByte);

return hexString.substring(position, position + 4);

/*int i = Integer.parseInt(firstByte, 16);

Log.d("zfr-i:==",i+"");

if ((i & 0x1f) == 0x1f) {

Log.d("zfr-2字节:=====","0000000000");

return hexString.substring(position, position + 4);

} else {

Log.d("zfr-1字节:=====","0000000000");

return hexString.substring(position, position + 2);

}*/

}

}

注:如有问题可以回复,看到第一时间分析解决,码农不易,感觉对您有用,帮助到您,可否打赏一杯可乐,在此谢过诸位,愿诸君终成大神,前程似锦~~~

java组装tlv_JAVA的TLV组解包相关推荐

  1. RPG Maker MV游戏解包

    该文章最新版本请前往:https://www.crowsong.xyz/127.html 前言 使用Petschko's RPG-Maker-MV File-Decrypter进行解包 使用Petsc ...

  2. java socket发送定长报文_定长消息报文的组包与解包简单封装(Java实现)

    报文 组包 解包 在实际项目中经常会碰到不同系统之间的数据交换,有些是用webservice.有些则是使用发socket消息的方式,将需要发送的消息组装成特定格式的字符串或Xml格式的文件,再通过so ...

  3. Java版ISO8583报文组包/解包

    文章目录 一.8583协议简介 二.位图规则 三.8583格式报文参考 四.组包/解包思路 五.相关代码 一.8583协议简介   8583协议是基于ISO8583报文国际标准的包格式的通讯协议,85 ...

  4. Protobuf解包组包

    解包代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...

  5. C杂讲 字符串格式化 组包与解包

    知识点1[sprintf组包] 案例: int sprintf(buf,"格式",数据) //buf:用来存放组好的报文 //"格式":按照格式组包 //数据: ...

  6. C语言字符串的组包解包

    组包解包 sprintf组包 sscanf解包 sscanf的高级用法1:使用%*s %*d 跳过提取的内容(不要提取的内容) sscanf的高级用法2:使用%[n]s %[n]d 提取指定宽度n的字 ...

  7. C语言---sprintf组包、sscanf解包

    目录 一.sprintf组包(了解) (一)案例1:将2022 9 24这三个数据组成一个"2022年9月24日" (二)案例2:将一个人的姓名.年龄.性别.家庭地址组成要求的格式 ...

  8. python unpacking_python packing unpacking 组包解包

    packing 组包,函数使用 [*] (for tuples)[元组], & [**](for dict) [ 字典]来接受可迭代的参数 unpacking 解包 ,函数内部定义多个参数(可 ...

  9. gb28181简单解包rtp ps流,推出rtmp(java版基于springboot):六、解包rtp ps流,推出rtmp

    解析流程参考 https://blog.csdn.net/chen495810242/article/details/39207305 代码基于github上的修改 https://github.co ...

最新文章

  1. CentOS6.5 升级 Python 2.7 版本
  2. 可能是目前最给力的开源硬件——ESPlay Micro V2,童芯派劲敌他来了
  3. Java对【JSON数据的解析】--官方解析法
  4. 指针嵌套指针 拷贝_C++智能指针小结
  5. cacti 整合nagios,以及总是off处理办法!
  6. 无需Grouping,中科大和微软亚研院提出Group-Free的三维物体检测方法,性能远超之前最好方法。...
  7. redis系列:分布式锁
  8. ahp层次分析法_基于层次分析法(AHP)的店铺选址应用研究
  9. 赵雅智_Swift(2)_swift常量和变量
  10. 开源软件 依赖_新的开源依赖项管理器在场
  11. 【汇编语言/底层开发】9、转移指令的原理
  12. php获取表单ip,PHP获取用户IP代码实现
  13. bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列
  14. Oracle如何一次插入多条数据
  15. 一套小程序源码多少钱_微信点餐小程序怎么做,微信扫码点餐系统多少钱一套?...
  16. 用html写个人简历
  17. 一周畅销书速报 | 端午节特别版
  18. php程序员后期发展前景,浅谈php程序员发展前景(一)
  19. 09-03 NOIP模拟测试36
  20. rtx服务器限制文件传输,rtx 服务器 文件传输 配置

热门文章

  1. JQ数组筛选,去重,对象数组求和
  2. 虚拟机中Ubuntu与主机共享文件夹
  3. Java多线程——三个多线程案例总结
  4. 初遇初识初知接下来是什么_红色卫衣搭配什么外套?最时髦的卫衣搭配别错过了...
  5. C#批量更改控件显示名称(举例中英文语言切换)
  6. 手机如何传输高清视频
  7. 进制转换--《二进制》
  8. 开会”就是我们的课堂
  9. Waymo将传感器成本降低90% Google无人驾驶汽车将更快普及
  10. win11无法运行脚本文件