tlv数据格式:type(1字节)+length(2字节)+value(有效数据);

长度规定(双方规定的):{低位、高位}   ,例:{(byte)0x5A,(byte)0x00} 转成int = 0x005A = 90 ;

package com.example.util;import android.util.Log;import java.io.IOException;
import java.io.InputStream;/*** @author alan*         Created by Administrator on 2018/4/8 0008.*/
public class TLVUtil {public interface CallBack {void getValue(String valueData);};/*** 从TLV格式数据流解析出中的value** @param inputStream*/public void parseValueFromTLVInputStream(InputStream inputStream, CallBack callBack) throws Exception {try {boolean isOnce = true;//开始一次tlv数据读取StringBuilder builder = new StringBuilder();int leftPartSize = 0;//剩余长度while (true) {Thread.sleep(50);if (inputStream == null) return;if (inputStream.available() > 0) {//收到一次推送的数据byte[] valueArray;int available = inputStream.available();//继续读取value(上次tlv不完整)if (!isOnce) {//                        byte[] buf = new byte[leftPartSize];
//                        int len = inputStream.read(buf);
//                        String part = new String(buf, 0, len);
//                        builder.append(part);if (leftPartSize > available) {//剩下已知的 > 读取的,还需要继续读取leftPartSize = leftPartSize - available;//取vaule数据valueArray = new byte[available];int read = inputStream.read(valueArray);String valueStr = new String(valueArray, 0, read);builder.append(valueStr);continue;} else {//剩下已知的 =< 读取的//拆分出最后已知的valueArray = new byte[leftPartSize];int read = inputStream.read(valueArray);String valueStr = new String(valueArray, 0, read);// 组成完整valuebuilder.append(valueStr);String allValue = builder.toString();builder = new StringBuilder();//清空//<处理>callBack.getValue(allValue);//开始下次tlv处理isOnce = true;available = available - leftPartSize;leftPartSize = 0;builder = new StringBuilder();//清空if (available == 0) {//没数据了,重新读流continue;}Log.e("TAG", "下次tlv处理-available->" + available);}}//tlv处理while (isOnce) {//取typebyte[] typeArray = new byte[1];inputStream.read(typeArray);int type = (typeArray[0] & 0xff);//第一个字节表示type(byte转int)//取length(2字节)byte[] lengthArray = new byte[2];inputStream.read(lengthArray);int length = bytesTolength(lengthArray);Log.e("TAG", "tlv-length->" + length);//判断if (available > (length + 3)) {//推过来的 》已知的 ,继续读剩下新的tlvisOnce = true;leftPartSize = available - (length + 3);available = leftPartSize;//取vaule数据(完整)valueArray = new byte[length];int read = inputStream.read(valueArray);String valueStr = new String(valueArray, 0, read);
//                            builder.append(valueStr);//<处理>callBack.getValue(valueStr);} else if (available == (length + 3)) {isOnce = true;//取vaule数据(完整)valueArray = new byte[length];int read = inputStream.read(valueArray);String valueStr = new String(valueArray, 0, read);
//                            builder.append(valueStr);//<处理>callBack.getValue(valueStr);break;} else {//available < (length + 3) 读取不完整,需要继续读取isOnce = false;leftPartSize = (length + 3) - available;//取vaule数据(不完整)valueArray = new byte[available - 3];int read = inputStream.read(valueArray);String valueStr = new String(valueArray, 0, read);builder.append(valueStr);break;}}//end while-isOnce}}} catch (IOException e) {e.printStackTrace();Log.e("TAG", "client connected name--->" + Thread.currentThread().getName() + "  e-->" + e.getMessage());
//            Log.e("TAG", "异常-tlv解析->" + e.getMessage());}}/*** byte数组转长度值 {低位,高位} [参照文档规定]** @param array* @return*/public int bytesTolength(byte[] array) {int length = 0;if (array != null) {length = ((array[0] & 0xff))| ((array[1] & 0xff) << 8);}return length;}
}

【Android】TVL数据流解析相关推荐

  1. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  2. Android源码解析(一)动画篇-- Animator属性动画系统

    Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...

  3. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  4. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/act ...

  5. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  6. Android Volley完全解析3:定制自己的Request

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17612763,CSDN 郭霖 经过前面两篇文章的学习,我们已经掌握了Volley各种Re ...

  7. Android Volley完全解析2:使用Volley加载网络图片

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 在上一篇文章中,我们了解了Volley到底是什么,以及它的 ...

  8. Android Volley完全解析1:初识Volley的基本用法

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 1. Volley简介 我们平时在开发Android应用的 ...

  9. 关于Android中XML解析方式

    XML解析一般有三种方式:DOM .SAX.PULL. SAX解析器:它是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作.当事件源产生事件后,调用事件处理器相应的 ...

最新文章

  1. ON、WHERE、HAVING的区别
  2. onedrive目录PHP源码,另一个OneDrive目录索引应用 OLAINDEX
  3. 工程师软技能3:如何学习
  4. java监听上传文件,Springmvc文件上传监听详解
  5. 全球人工智能人才培养与发展趋势
  6. Leetcode639. Decode Ways II
  7. 上一页、下一页链接(采用分页方式)
  8. 台电p10hd拆解_台电X19HD玩家拆机报告
  9. 申城一叙:SDCC 2017·上海站数据库专场讲师+议题抢鲜版纵览
  10. java多线程复习与巩固(一)
  11. python基础教程python详细教程
  12. win7共享中心服务器运行失败,win7网络共享中心打不开怎么办
  13. 4484: [Jsoi2015]最小表示 bitset+拓扑序
  14. 实践项目一 项目开发团队分配管理
  15. VS2008假死点击无反应解决办法
  16. 10周成为数据分析师!
  17. 导出数据库的longblob
  18. 如何在不安装应用程序的情况下旋转iPhone视频
  19. 2022DASCTF Apr X FATE 防疫挑战赛 部分web复现
  20. crmsh配置pacemaker集群时报错 CIB not supported: validator 'pacemaker-2.10'

热门文章

  1. 腾讯云Centos系统下中文显示乱码解决
  2. 2023届秋招总结_嵌入式软件开发
  3. halcon xld相关算子
  4. 结束了explorer进程电脑桌面没了
  5. 下一个倒计时又在哪里
  6. 【有利可图网】PS实战系列:PS制作多层次折叠纸张字
  7. QC、QOC、IPQC、QA公司产品的“公检法”
  8. Python帮你设计个人签名
  9. PHP 功能木马 webshell
  10. 【国科大模式识别】第二次作业(阉割版)