问题描述
- 这个代码对于这个数据包什么意思?它是怎么算出来的?
-
int splitFlag=0;
int splitNextFlag=0;
//int byteLength=1;
//int byteLengthTemp=newBytes[2]& 0xFF;
//byteLength=byteLengthTemp+2;
//boolean runFlag=true;
while(splitNextFlag<newBytes.length){
try {
splitFlag=splitNextFlag;//每次都更新读取的起始位置if(newBytes[splitFlag] != (byte)0xFF){ throw new RuntimeException("设备"+recEntity.getDeviceId()+"接收数据异常,信息分组首字节不是FF : "+CommUtils2.toHexString(newBytes));
// throw new RuntimeException("接收数据异常,信息分组首字节不是FF:" + logMsg);
} byte recFlag=newBytes[splitFlag+1]; //标识符位 int byteLengthTemp=newBytes[splitFlag+2]& 0xFF;//车道字节所占长度 int splitFlagTemp=splitFlag; splitNextFlag=splitFlagTemp+byteLengthTemp+4;//读取下条数据起始位置 if(newBytes.length==170){ switch (recFlag) { case 0x20: flowBytes2=ArrayUtils.subarray(newBytes, splitFlag,splitNextFlag); System.out.println("中车流量"+CommUtils2.toHexString(flowBytes2)); break;
解决方案
通过代码去理解数据包的格式,就好比根据脚印去推测人的长相一样。
你应该优先去看文档、或者询问制定协议的人。
解决方案二:
如果你实在没有文档,也找不到协议制定者,那么你也不是傻看代码,你应该尽量采集更多的数据包样本。
同时尝试修改你的程序,对各种你不确定的地方做各种修改尝试,找出规律。
解决方案三:
根据协议来定义的数据包,开发者应该配合协议来查看代码! if(newBytes[splitFlag] != (byte)0xFF)该协议的开始码应该是0xff,
至于后面的是什么以及该协议的长度是多少以及结束码、校验码等等都应该看协议。
解决方案四:
根据协议来定义的数据包,开发者应该配合协议来查看代码! if(newBytes[splitFlag] != (byte)0xFF)该协议的开始码应该是0xff,
至于后面的是什么以及该协议的长度是多少以及结束码、校验码等等都应该看协议。
解决方案五:
看你这代码,感觉数据最小包格式应该是:0xff(1byte头)+标识符(1byte)+该数据包有效字节长度(1byte)+有效数据(该数据包有效字节长度byte)+结束符(1byte)。然后代码里的“newBytes”应该是有可能包含多个这样的完整包。然后代码中意思就是“newBytes”的长度为170并且最小包标识符为0x20时,将该最小包数据的所有字节以十六进制打印出来。
时间: 2024-12-20 20:07:14