【Android】TVL数据流解析
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数据流解析相关推荐
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...
- Android源码解析(一)动画篇-- Animator属性动画系统
Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/act ...
- Android Service完全解析,关于服务你所需知道的一切(下)
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
- Android Volley完全解析3:定制自己的Request
原文链接:http://blog.csdn.net/guolin_blog/article/details/17612763,CSDN 郭霖 经过前面两篇文章的学习,我们已经掌握了Volley各种Re ...
- Android Volley完全解析2:使用Volley加载网络图片
原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 在上一篇文章中,我们了解了Volley到底是什么,以及它的 ...
- Android Volley完全解析1:初识Volley的基本用法
原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 1. Volley简介 我们平时在开发Android应用的 ...
- 关于Android中XML解析方式
XML解析一般有三种方式:DOM .SAX.PULL. SAX解析器:它是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作.当事件源产生事件后,调用事件处理器相应的 ...
最新文章
- ON、WHERE、HAVING的区别
- onedrive目录PHP源码,另一个OneDrive目录索引应用 OLAINDEX
- 工程师软技能3:如何学习
- java监听上传文件,Springmvc文件上传监听详解
- 全球人工智能人才培养与发展趋势
- Leetcode639. Decode Ways II
- 上一页、下一页链接(采用分页方式)
- 台电p10hd拆解_台电X19HD玩家拆机报告
- 申城一叙:SDCC 2017·上海站数据库专场讲师+议题抢鲜版纵览
- java多线程复习与巩固(一)
- python基础教程python详细教程
- win7共享中心服务器运行失败,win7网络共享中心打不开怎么办
- 4484: [Jsoi2015]最小表示 bitset+拓扑序
- 实践项目一 项目开发团队分配管理
- VS2008假死点击无反应解决办法
- 10周成为数据分析师!
- 导出数据库的longblob
- 如何在不安装应用程序的情况下旋转iPhone视频
- 2022DASCTF Apr X FATE 防疫挑战赛 部分web复现
- crmsh配置pacemaker集群时报错 CIB not supported: validator 'pacemaker-2.10'